0

List <string>を に変換するにはどうすればよいDictionary<string, int>ですか?

これは、0 から n までの数値でなければなりません。

4

2 に答える 2

5

を使用して任意ToDictionary()の から を作成できます。DictionaryIEnumerable

var list = new List<string>() { "Foo", "Bar", "Spam" };

// TKey is int, TValue is string
int i = 0;
Dictionary<int,string> dict1 = list.ToDictionary( _ => i++ );          

// TKey is string, TValue is int
i = 0;
Dictionary<string,int> dict2 = list.ToDictionary( x => x, _ => i++ );

に渡されるラムダToDictionarykeySelector. 通常はこれを使用して の項目からキーとなるプロパティを選択IEnumerableしますが、ここではカウントを提供するために使用します。

編集: 2 番目のバージョンでは、2 つのセレクターを使用します。最初は鍵です。x => xラムダを提供することで、リストから取得した文字列を使用しているだけです。2 番目のセレクターは値です。ここでは、カウンターを提供していiます。


パフォーマンス

私は、自分の方法と pst の方法のパフォーマンスをテストすることにしました。

テストコード:

static void Main(string[] args) {
    const int N = 1000000;
    const int M = 10;
    Stopwatch s;

    // Generate test list of strings.
    var list = Enumerable.Range(0, N).Select(n => n.ToString());

    // Just so it's enumerated once before.
    var ar = list.ToArray(); 

    // Try Jonathon's method M times.
    s = Stopwatch.StartNew();
    for (int x = 0; x < M; x++) {
        int i = 0;
        //var dict1 = list.ToDictionary(_ => i++);    // Before question edit
        var dict1 = list.ToDictionary(x => x, _ => i++);
    }
    s.Stop();
    Console.WriteLine("Jonathon's i++ method took {0} ms", s.ElapsedMilliseconds);

    // Try pst's method M times.
    s = Stopwatch.StartNew();
    for (int x = 0; x < M; x++) {
        var dict2 = list.Select((v, j) => new {v, j}).ToDictionary(p => p.v, p => p.j);
    }
    s.Stop();
    Console.WriteLine("psts' Select() method took {0} ms", s.ElapsedMilliseconds);

    Console.ReadLine();
}

出力:

Jonathon's i++ method took 3005 ms
pst's Select() method took 5019 ms

出力 (質問編集後):

Jonathon's i++ method took 3521 ms
pst's Select() method took 5103 ms

結論として、匿名型の中間オブジェクトを作成する代わりにカウンターを使用することで、約 40% の改善が見られます。

于 2012-11-29T05:42:16.923 に答える
4

n各アイテムがキーにマップされ、ソース内のインデックスを表すと仮定すると、次のようになります。

var dict = list
    .Select((v, i) => new {v, i})
    .ToDictionary(p => p.v, p => p.i);

一時的な匿名型は少し不安定ですが、自己完結型の副作用のない式であるため、このアプローチが気に入っています。

(ソース リストに重複するアイテムがある場合、これは例外をスローします。)

于 2012-11-29T05:44:34.737 に答える