3

この文字列配列を変換するエレガントな方法はありますか:

string[] a = new[] {"name", "Fred", "colour", "green", "sport", "tennis"};

配列の連続する 2 つの要素ごとに辞書の 1 つの {key, value} ペアになるような Dictionary に (つまり、{"name" -> "Fred", "colour" -> "green", "sport" -> "テニス"})?

ループで簡単に実行できますが、LINQ を使用するなど、よりエレガントな方法はありますか?

4

7 に答える 7

5
var dict = a.Select((s, i) => new { s, i })
            .GroupBy(x => x.i / 2)
            .ToDictionary(g => g.First().s, g => g.Last().s);
于 2012-09-14T14:20:05.410 に答える
4

これは配列なので、次のようにします。

var result = Enumerable.Range(0,a.Length/2)
                       .ToDictionary(x => a[2 * x], x => a[2 * x + 1]);
于 2012-09-14T14:24:44.673 に答える
2

これはどう ?

    var q = a.Zip(a.Skip(1), (Key, Value) => new { Key, Value })
             .Where((pair,index) => index % 2 == 0)
             .ToDictionary(pair => pair.Key, pair => pair.Value);
于 2012-09-14T14:33:34.860 に答える
1

このタイプのリクエストを処理するための類似メソッドを作成しました。ただし、配列にはキーと値の両方が含まれているため、最初にこれを分割する必要があると思います。

次に、このようなものを使用してそれらを組み合わせることができます

public static IDictionary<T, T2> ZipMyTwoListToDictionary<T, T2>(IEnumerable<T> listContainingKeys, IEnumerable<T2> listContainingValue)
    {
        return listContainingValue.Zip(listContainingKeys, (value, key) => new { value, key }).ToDictionary(i => i.key, i => i.value);
    }
于 2012-09-14T14:18:27.153 に答える
0
IEnumerable<string> strArray = new string[] { "name", "Fred", "colour", "green", "sport", "tennis" };


            var even = strArray.ToList().Where((c, i) => (i % 2 == 0)).ToList();
            var odd = strArray.ToList().Where((c, i) => (i % 2 != 0)).ToList();

            Dictionary<string, string> dict = even.ToDictionary(x => x, x => odd[even.IndexOf(x)]);
于 2012-09-14T14:36:04.190 に答える
0
a.Select((input, index) = >new {index})
  .Where(x=>x.index%2!=0)
  .ToDictionary(x => a[x.index], x => a[x.index+1])

forループを使用することをお勧めしますが、あなたの要求に応じて回答しました..これは決してきれい/きれいではありません..

于 2012-09-14T14:17:02.053 に答える
0
public static IEnumerable<T> EveryOther<T>(this IEnumerable<T> source)
{
    bool shouldReturn = true;
    foreach (T item in source)
    {
        if (shouldReturn)
            yield return item;
        shouldReturn = !shouldReturn;
    }
}

public static Dictionary<T, T> MakeDictionary<T>(IEnumerable<T> source)
{
    return source.EveryOther()
        .Zip(source.Skip(1).EveryOther(), (a, b) => new { Key = a, Value = b })
        .ToDictionary(pair => pair.Key, pair => pair.Value);
}

これが設定されている方法とそのZip仕組みにより、リストに奇数の項目がある場合、何らかの例外を生成するのではなく、最後の項目が無視されます。

注:この回答から派生しました。

于 2012-09-14T14:34:24.897 に答える