简单的查找功能
本文关键字:功能 查找 简单 | 更新日期: 2023-09-27 18:25:21
我有一个简单的结构,我想用它作为查找表:
public struct TileTypeSize
{
public string type;
public Size size;
public TileTypeSize(string typeIn, Size sizeIn)
{
type = typeIn;
size = sizeIn;
}
}
我这样填充:
tileTypeSizeList.Add(new TileTypeSize("W",rectangleSizeWall));
tileTypeSizeList.Add(new TileTypeSize("p",rectangleSizePill));
tileTypeSizeList.Add(new TileTypeSize("P",rectangleSizePowerPill));
tileTypeSizeList.Add(new TileTypeSize("_",rectangleSizeWall));
tileTypeSizeList.Add(new TileTypeSize("=",rectangleSizeWall));
查找给定类型的大小最有效的方法是什么?
提前感谢!
通常,最有效的方法是将数据放入Dictionary
或类似容器中(SortedDictionary
和SortedList
与Dictionary
的差异很小,在某些情况下更适合):
var dict = new Dictionary<string, Size>
{
{ "W", rectangleSizeWall },
// etc
}
然后:
var size = dict["W"];
当然,如果有理由的话,您仍然可以按顺序迭代字典中的值
如果你只需要查找5种类型(即问题的大小小得离谱),那么像你这样的直接列表可能比关联容器更快。因此:
var tileStruct = tileTypeSizeList.FirstOrDefault(s => s.type == "W");
if (tileStruct.type == "") {
// not found
}
else {
var size = tileStruct.size;
}
如果您确信永远不会错过搜索,则可以删除"如果找到"复选框。
如果您知道集合中只有一个匹配项,那么您可以使用:
var size = tileTypeSizeList.Single(t => t.type == someType).size;
如果没有,你必须更聪明一点,才能正确处理没有匹配的情况:
Size size;
var match =
tileTypeSizeList
.Cast<TileTypeSize?>().FirstOrDefault(t => t.type == someType);
if(match != null) size = match.size;
不过,请记住,如果这是结构中唯一的数据,则有更好的方法来存储这些信息。我建议使用Dictionary<string, Size>
。
var type = tileTypeSizeList.FirstOrDefault(t => t.type == someType);
if(type==null) throw new NotFoundException();
return type.size;
但是,如果列表很大,并且您需要经常查找数据,则最好使用Dictionary
,正如其他答案中所注意到的那样。
使用字典而不是列表:
Dictionary<string, TileTypeSize> tileTypeSizeDictionary = Dictionary<string, TileTypeSize>();
tileTypeSizeDictionary.Add("W", new TileTypeSize("W",rectangleSizeWall));
...
您使用查找元素
TileTypeSize rectangleSizeWall = tileTypeSizeDictionary["W"];
当您需要按关键字查找时,字典比列表快。