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

一般に、最も効率的な方法は、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 に答える
3

コレクション内に 1 つだけ一致することがわかっている場合は、次を使用できます。

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 に答える
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 に答える