C# 简单查找函数

C# 简单查找函数,c#,list,lookup,C#,List,Lookup,我有一个简单的结构,我想用作查找表: public struct TileTypeSize { public string type; public Size size; public TileTypeSize(string typeIn, Size sizeIn) { type = typeIn; size = sizeIn; } } 我这样说: tileTypeSizeList.Add(new Til

我有一个简单的结构,我想用作查找表:

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));
查找给定类型的大小最有效的方法是什么


提前谢谢

如果您知道集合中只有一个匹配项,则可以使用:

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;
Size;
变量匹配=
提利佩西主义者
.Cast().FirstOrDefault(t=>t.type==someType);
如果(match!=null)size=match.size;
但是请记住,如果该信息是结构中唯一的数据,则有更好的方法来存储该信息。我建议买一本
字典


但是,如果列表很大,并且您确实需要经常查找数据,那么您最好使用
字典,正如在其他答案中注意到的那样。

使用字典而不是列表:

Dictionary<string, TileTypeSize> tileTypeSizeDictionary = Dictionary<string, TileTypeSize>();
tileTypeSizeDictionary.Add("W", new TileTypeSize("W",rectangleSizeWall));
...

当您需要按键查找时,字典比列表更快。

一般来说,最有效的方法是将数据放入一个或类似的容器中(与
字典
有一些小的区别,在某些情况下更适合):

当然,如果有理由,您仍然可以按顺序迭代字典中的值

如果您要查找的只有5种类型(即问题的规模小得离谱),那么像您这样的直接列表可能比关联容器更快。因此:

var tileStruct = tileTypeSizeList.FirstOrDefault(s => s.type == "W");
if (tileStruct.type == "") {
    // not found
}
else {
    var size = tileStruct.size;
}

如果您确信永远不会错过搜索,您可以删除“如果找到”复选框。

如果这是您的结构包含的全部内容,那么为什么不使用字典呢?虽然接受的答案是正确的,但是如果您必须使用
结构,请确实确保它不可更改(正如您目前使用的那样)。易变的
struct
语义是非常有害的。解决方案是:将那些字段设置为
私有只读
而不是
公共
,并为每个字段设置带有
get
访问器的属性。使用
Single()accurate@Basic-假设列表中只有一个匹配项。OP没有说名称是唯一的。我从给定类型的
look up\u size
推断出来,但我同意这是不明确的
First
如果没有找到元素,就会抛出异常:
TileTypeSize
是一个值类型,所以空检查不起作用。这更简单,更符合我的需要。干杯-使用字典是最好的选择。干杯
  TileTypeSize rectangleSizeWall = tileTypeSizeDictionary["W"];
var dict = new Dictionary<string, Size>
{
     { "W", rectangleSizeWall },
     // etc
}
var size = dict["W"];
var tileStruct = tileTypeSizeList.FirstOrDefault(s => s.type == "W");
if (tileStruct.type == "") {
    // not found
}
else {
    var size = tileStruct.size;
}