2

値のリストを含む辞書があります

リストは実行時に動的に追加されます。c#では、辞書からすべてのリストを圧縮するにはどうすればよいですか?

サンプル:

Dictionary<string, List<string>> MyDictionary = new Dictionary<string, List<string>>();

List<int> firstlist= new List<string>();

firstlist.Add("one");

firstlist.Add("two");

firstlist.Add("three");

firstlist.Add("four");

List<int> secondlist= new List<int>();

secondlist.Add(1);

secondlist.Add(2);

secondlist.Add(3);

secondlist.Add(4);

MyDictionary.Add("Words", firstlist);
MyDictionary.Add("Number", secondlist);

mydictionary からすべてのリストを圧縮したいので、結果は次のようになります。

one       1
two       2
three     3
four      4
4

3 に答える 3

5

与えられたDictionarys List:

var d = new Dictionary<string, List<string>>()
{
    {"first",  new List<string>() {"one", "two", "three"}},
    {"second", new List<string>() {"1",   "2",   "3"}}, 
    {"third",  new List<string>() {"A",   "B",   "C"}}
};

この一般的な方法を使用できます:

IEnumerable<TResult> ZipIt<TSource, TResult>(IEnumerable<IEnumerable<TSource>> collection, 
                                            Func<IEnumerable<TSource>, TResult> resultSelector)
{
    var enumerators = collection.Select(c => c.GetEnumerator()).ToList();
    while (enumerators.All(e => e.MoveNext()))
    {
        yield return resultSelector(enumerators.Select(e => (TSource)e.Current).ToList());
    }
}

このディクショナリ内のすべてのリストを圧縮するには、たとえば次のようにします。

var result = ZipIt(d.Values, xs => String.Join(", ", xs)).ToList();

result今でしょ

ここに画像の説明を入力

この方法では、値を組み合わせる方法を選択できることに注意してください。私の例では、,区切り文字列を作成するだけです。他のものを使用することもできます。

于 2013-01-10T09:11:43.680 に答える
0

試す:

var dictionary = firstlist.Zip(secondlist, (value, key) => new { value, key })
                         .ToDictionary(x => x.key, x => x.value);

ドキュメントからこの例を見てください:

 int[] numbers = { 1, 2, 3, 4 };
 string[] words = { "one", "two", "three" };

 var numbersAndWords = numbers.Zip(words, (first, second) => first + " " + second);

 foreach (var item in numbersAndWords)
     Console.WriteLine(item);

 // This code produces the following output: 
 // 1 one 
 // 2 two 
 // 3 three

編集:

辞書のリストにアクセスするには、次を使用します。

(List<string>)MyDictionary["words"];
(List<int>)MyDictionary["numbers"];

例えば:

List<string> words = (List<string>)MyDictionary["words"];
List<int> numbers = (List<int>)MyDictionary["numbers"];
for (int i = 0; i < words.Count; i++) // Loop through List with for
{
    Console.WriteLine(words[i] + numbers [i]);
}
于 2013-01-10T08:59:59.910 に答える
0

ドキュメントの例からさかのぼってみましょう。

    int[] numbers = { 1, 2, 3, 4 };
    string[] words = { "one", "two", "three" };

    var numbersAndWords = numbers.Zip(words, (first, second) => first +
         " " + second);

    foreach (var item in numbersAndWords)
        Console.WriteLine(item);

    // This code produces the following output: 

    // 1 one 
    // 2 two 
    // 3 three

したがって、上記の辞書を使用すると、次のようになります。

    var numbersAndWords = MyDictionary["Words"]
        .Zip(MyDictionary["Number"], (first, second) => first + "\t" + second);

    foreach (var item in numbersAndWords)
        Console.WriteLine(item);

    // This code produces the following output: 

    // one       1
    // two       2
    // three     3
    // four      4
于 2013-01-10T09:07:59.280 に答える