C # - объединение коллекций вопрос - PullRequest
2 голосов
/ 28 марта 2011

Если у меня есть IDictionary<int, int>, возможно ли получить IEnumerable<int>, который будет содержать каждый KeyValuePair<int, int>, разобранный на две (int, int) записи, вставленные одна за другой?

Маленькийпример:

Dictionary:
5 - 25
6 - 36
7 - 49

Wanted Enumerable:
5, 25, 6, 36, 7, 49

Кроме того, я хотел, чтобы это было в одном супер-симпатичном утверждении, но я не мог придумать подходящий:)


Обновление:

Позволяет ли LINQ вставлять более одного элемента в оператор .Select, что разделяет идею:

xyz.Select(t => (t, null))

чтобы полученное значение Enumerable сразу после него содержало t и null?

Ответы [ 6 ]

8 голосов
/ 28 марта 2011

Вы можете использовать SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>) (плюс перегрузки).Вот пример

var dict = new Dictionary<int, int> {
   { 5, 25 },
   { 6, 36 },
   { 7, 49 } 
}; 

var projection = dict.SelectMany(kv => new[] { kv.Key, kv.Value });

Согласно комментариям, это только один из способов достижения того, что вы просили.

4 голосов
/ 28 марта 2011

Вы можете создать метод, который будет разлагать ваш словарь на IEnumerable так, как вы хотите.

using System.Collections.Generic;
using System;

public class C {

    public static void Main()
    {
        var dic = new Dictionary<int,int>();
        dic[0] = 1;
        dic[2] = 3;
        dic[4] = 5;

        foreach (var i in Decompose(dic))
            Console.WriteLine(i);

        Console.ReadLine();
    }

    public static IEnumerable<int> Decompose(IDictionary<int,int> dic)
    {
        foreach (var i in dic.Keys)
        {
            yield return i;
            yield return dic[i];
        }
    }
}

Вывод:

  0
  1
  2
  3
  4
  5
2 голосов
/ 28 марта 2011

Я бы подумал об этом как

var enumerable = Mix(dict.Keys, dict.Values);

Я верю в .NET Framework 4.0 Enumerable.Zip подходит [1]

Так что я нашел время для реализации этого MixSequence метод, Обратите внимание, как просто для забавы я сделал это n-ary, поэтому он будет объединять любое количество последовательностей (не только 2).

[1] Обновление См. здесь , здесь или здесь для фона.

1 голос
/ 28 марта 2011

попробуйте использовать следующие методы:

var list = dictionary.Keys.ToList();
var list2 = dictionary.Values.ToList();

Вы можете объединить эти списки в один.

0 голосов
/ 28 марта 2011

dict.Select (d => new [] {d.Key, d.Value}). SelectMany (d => d)

0 голосов
/ 28 марта 2011

Вы можете создать объект / коллекцию / что у вас с помощью LINQ. Скажем, вы хотите объединить два совершенно разных / не связанных (или едва связанных) элемента в один (псевдокод следует):

List<KeyValuePair<string, string>> newList = (from a in AList
                                              select new KeyValuePair<string, string> 
                                              {
                                                a,
                                                getBfromA(a)
                                              });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...