3

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

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));

查找给定类型的大小的最有效方法是什么?

提前致谢!

4

4 回答 4

3

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

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>.

于 2013-07-29T21:29:47.600 回答
3

一般来说,最有效的方法是将您的数据放入一个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;
}

如果您确定您永远不会错过搜索,您可以删除“如果找到”检查。

于 2013-07-29T21:32:06.463 回答
2
var type = tileTypeSizeList.FirstOrDefault(t => t.type == someType);
if(type==null) throw new NotFoundException();
return type.size;

但是,如果列表很大并且您需要经常查找数据,则最好使用Dictionary其他答案中注意到的数据。

于 2013-07-29T21:30:52.850 回答
2

使用字典而不是列表:

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

你查找你的元素:

  TileTypeSize rectangleSizeWall = tileTypeSizeDictionary["W"];

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

于 2013-07-29T21:31:21.320 回答