#linq
#linq
Вопрос:
У меня есть сложные данные таким образом
<Complex Data>
<Data Level 1>..........</Data> (only single row)
<Data>...................(n rows)
<Data 2a>............</Data> (only single row)
<Data 2b>............</Data> (n row)
<Id></Id>.....................(unique key)
</Data2>
</Complex Data>
У меня есть эти сложные данные LIST<COMPLEX DATA>
. Мне нужно сгруппировать эти сложные данные, используя элемент из <Data 2a.......eg: Place> </Data2a>
Я пытаюсь реализовать это, но получаю только дочерний тип данных только <Data 2a>
вместо родительского типа данных <Data2>
.
как я могу преобразовать этот дочерний тип данных в родительский тип данных после группировки
как я могу реализовать это в для каждого цикла.
Комментарии:
1. это XML? Если нет, можете ли вы вставить определение класса?
Ответ №1:
Если вам нужно сгруппировать сложные данные, то вы должны использовать GroupBy в Linq, а не использовать цикл for или для каждого
На есть несколько простых примеров группирования поhttp://msdn.microsoft.com/en-us/vbasic/bb738046 — первый пример (на VB) должен охватывать то, что вам нужно?
В качестве альтернативы, этот учебник по группировке LinqToXml довольно хорош: http://msmvps.com/blogs/martin_honnen/archive/2009/11/27/grouping-with-linq-to-xml.aspx
Ответ №2:
Если я правильно понял ваш пост, вы ищете что-то вроде этого:
var grouping = source
.SelectMany(x => x.Items.Select(y => Tuple.Create(x, y))
.SelectMany(t1 => t1.Item2.Items.Select(z => Tuple.Create(t1.Item1, z))
.GroupBy(t2 => t2.Item2, t2 => t2.Item1);
Это немного некрасиво, если вы хотите спроецировать, но таким образом сохраняйте ссылку на исходный элемент…
Элемент1 — это ваши полные данные, а Элемент2 — ваша текущая проекция. Вложенный цикл foreach делает его более читаемым:
IEnumerable<Tuple<K, TSource>> SelectManyKeys(IEnumerable<TSource> source)
{
foreach (var x in source)
{
foreach (var k in x.Items.SelectMany(z => z.Items))
{
yield return Tuple.Create(k, x);
}
}
}
var grouping = SelectManyKeys(source).GroupBy(t => t.Item1, t => t.Item2));
Комментарии:
1. привет, Подгузник, спасибо за твой ответ… Но я использую .Net 3.5, он не поддерживает Tuple. Create() . вот запрос, который я написал для GroupBy = objMedData.Data . Выберите(FB => FB.Data. GroupBy(FF=>FF.PrimaryInsuranceID)); я получил результат как объект данных, но мне нужен результат как ComplexData
2. @CEEYES: Вместо кортежей вы также можете использовать анонимные типы:
new { ComplexData = x, Projection = y }
.3. hii Nappy, Можете ли вы прислать мне пример, аналогичный моей ситуации для этого типа. Потому что я новичок в LINQ….