5

を取り、各要素を のインデックスにマップListする を生成したいと思います。私はこれを次のように行うことができます:DictionaryListList<string>

var myList = new List<string>{ /* populate list */ };
var orderMap = new Dictionary<string, int>();

foreach (var element in myList)
{
    orderMap[element] = myList.IndexOf(element);
}

基本的に、私は次のようなリストを取りたいです:

Apple
Banana
Orange

インデックスを示すマ​​ップを返します。

Apple -> 0
Banana -> 1
Orange -> 2

Linqでこれを行うにはどうすればよいですか? 私はこのようなものがうまくいくはずだと思います:

orderMap = myList.Select( x => /* return a key value pair mapping x to myList.IndexOf(x) */ );

しかし、正しい構文がわかりません。また、に使用するデリゲートでリスト自体を参照できますSelectか?

4

3 に答える 3

10

デリゲート内のリストを参照することはできますが、一般的には良い考えではありません。Selectインデックスと値を提供するオーバーロードを本当に使用したい:

var dictionary = list.Select((value, index) => new { value, index })
                     .ToDictionary(p => p.value, p => p.index);

重複する要素がある場合、これは例外をスローすることに注意してください。

于 2012-12-12T07:41:22.677 に答える
4

ToDictionary拡張メソッドを試すことができます:

int index = 0; 
orderMap = myList.ToDictionary(x => x, x => index++);
于 2012-12-12T07:41:46.043 に答える
0

のこのオーバーロードをToDictionary<TKey, TValue>()見てください。入力要素をキーと値に変換するには関数が必要です。

例えば

var myList = new List<string>{ /* populate list */ };
var orderMap = myList.ToDictionary(x => myList.IndexOf(x), x => x);

ただし、これに関する 1 つの問題は、 の要素がmyList一意でない場合です。

于 2012-12-12T07:42:44.567 に答える