2015-04-10 3 views
4

Я пытаюсь преобразовать следующую коллекцию:как денормализовать коллекцию, которая содержит коллекцию с помощью Linq

Источник

"a", "b", {1,2,3} 
"d", "f", {1,2,2} 
"y", "z", {} 

назначения

"a", "b", 1 
"a", "b", 2 
"a", "b", 3 
"d", "f", 1 
"d", "f", 2 
"d", "f", 2 
"y", "z", null 

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

Проблема похожа на: How do I select a collection within a collection using LINQ?, которая денормализует коллекцию, но не показывает, как включить связанные столбцы (столбцы 1 и 2 в моем примере).

Разница в том, что мне нужно включить первые два столбца, а также вернуть строку, в которой нет записей в коллекции.

+3

Показать код. Каков тип коллекций? Что-то вроде 'IEnumerable >>'? – Henrik

+0

@ Хенрик Извинения, я должен был предоставить код. Я не публикую очень часто, но, конечно же, буду помнить, что будущие должности ставят мои вопросы яснее для всех. Кстати, вы были на месте с вашей догадкой! – dubs

ответ

1

Использование списка кортежей в качестве примера:

var source = new List<Tuple<string, string, int[]>> { 
    Tuple.Create("a", "b", new int[] {1,2,3}), 
    Tuple.Create("d", "f", new int[] {1,2,2}), 
    Tuple.Create("y", "z", new int[0]) 
}; 


var destination = 
from t in source 
from i in t.Item3.Select(x => (int?)x).DefaultIfEmpty() 
select Tuple.Create(t.Item1, t.Item2, i); 
+0

Удары по деньгам! Благодарю. – dubs

0

Проверьте один из возможных решений:

var source = new List<Tuple<string, string, int[]>>{ 
     new Tuple<string,string,int[]>("a", "b", new int[]{1,2,3}), 
     new Tuple<string,string,int[]>("d", "f", new int[]{1,2,2}), 
     new Tuple<string,string,int[]>("y", "z", new int[]{}) 
    }; 

    var destination = source.SelectMany(
     tuple => tuple.Item3.Length == 0 ? new int?[] { null } : tuple.Item3.Cast<int?>(), 
      (tuple, collectionElement) => new { tuple.Item1, tuple.Item2, collectionElement } 
    ).ToList(); 
2

Предположим, что есть некоторые подходящие типы Src и Dst для элементов Source и Destination , Затем, аналогично example из документации, задача может быть решена с помощью следующего утверждения.

Dest = Source.SelectMany(
    iSrc => iSrc.Third, 
    (iSrc,No) => new Dest(){ First = iSrc.First, 
          Second = iSrc.Second, 
          Third = No 
          } 
); 
Смежные вопросы