как сгруппировать много строк в один ряд? - PullRequest
3 голосов
/ 28 июля 2011

Я получил что-то вроде этого:

   int, string
   ------------
    1, 'test1'
    1, 'test2'
    2, 'test1'
    2, 'test2'
    2, 'test3'
    3, 'test1'
    4, 'test1'
    4, 'test2'

Я хочу преобразовать это в

   int, string
   ------------
    1, 'test1, test2'
    2, 'test1, test2, test3'
    3, 'test1'
    4, 'test1, test2'

Я пробовал много вещей, например GroupBy с SelectMany, но это дает мне ошибки во время выполнения

Ответы [ 3 ]

5 голосов
/ 28 июля 2011

Это сработало для меня:

var list = new List<KeyValuePair<int, string>>() {
           new KeyValuePair<int, string>(1, "test1"),
           new KeyValuePair<int, string>(1, "test2"),
           new KeyValuePair<int, string>(2, "test1"),
           new KeyValuePair<int, string>(2, "test2"),
           new KeyValuePair<int, string>(2, "test3"),
           new KeyValuePair<int, string>(3, "test1"),
           new KeyValuePair<int, string>(4, "test1"),
           new KeyValuePair<int, string>(4, "test2"),
        };

        var result = (from i in list
                      group i by i.Key into g
                      select new
                      {
                          Key = g.Key,
                          Values = string.Join(", ", (from k in g
                                                      select k.Value))
                      });

        foreach (var x in result)
        {
            Console.WriteLine(x.Key + " - " + x.Values);
        }
1 голос
/ 28 июля 2011

Если ваш тип:

class Foo
{
   public int MyInt { get; set;}
   public string MyString { get; set; }
}

Тогда ваш запрос будет выглядеть примерно так:

IEnumerable<Foo> foos = ..    
var output = foos.GroupBy(foo => foo.MyInt, foo => foo.MyString);

Я предполагаю, что вам не нужно объединять строки в группе (так как вы упомянули SelectMany).

0 голосов
/ 28 июля 2011

Я понятия не имею, как выглядит структура вашего объекта, но следующее должно помочь вам в этом.

var rawData = new []
{
    new { Id = 1, Description = "test1" },
    new { Id = 1, Description = "test2" },
    new { Id = 2, Description = "test3" },
    new { Id = 2, Description = "test4" },
    new { Id = 3, Description = "test4" },
};

var result = from data in rawData
    group data by data.Id into g
select new { g.Key, Descriptions = string.Join(",", g.Select(i => i.Description)) };

result.Dump();

Вы можете проверить эти операторы, используя LinqPad (http://www.linqpad.net)

...