kedar001 Ответов: 1

Как я могу написать запрос linq


Public Class A
{
public int ID{get;set;}
public list<b> lstB {get;set;}
}

Public Class B
{
Public int ID{get;st;}
Public string Name{get;st;}
Public string Path{get;st;}
}



как я могу написать запрос linq для поиска дубликатов имен из списка класса A

Что я уже пробовал:

lstDocumentsWithError = lstA.GroupBy(x => x.lstB).SelectMany(g => g.Skip(1)).ToList();

1 Ответов

Рейтинг:
9

Maciej Los

В зависимости от ситуации...

Я проверил следующие запросы в этом списке:

List<A> lstA = new List<A>
		{
			new A(){
				ID = 1, lstB = new List<b>()
					{
						new B(){ID = 1, Name="A", Path="C"},
						new B(){ID = 2, Name="A", Path="D"},
						new B(){ID = 3, Name="B", Path="E"},
						new B(){ID = 4, Name="C", Path="F"},
						new B(){ID = 5, Name="D", Path="G"}
					}},
			new A(){
				ID = 2, lstB = new List<b>()
					{
						new B(){ID = 6, Name="D", Path="C"},
						new B(){ID = 7, Name="E", Path="D"},
						new B(){ID = 8, Name="E", Path="E"},
						new B(){ID = 9, Name="F", Path="F"},
						new B(){ID = 10, Name="F", Path="G"}
					}},
			new A(){
				ID = 3, lstB = new List<b>()
					{
						new B(){ID = 11, Name="F", Path="C"},
						new B(){ID = 12, Name="G", Path="D"},
						new B(){ID = 13, Name="H", Path="E"},
						new B(){ID = 14, Name="H", Path="F"},
						new B(){ID = 15, Name="H", Path="G"}
					}},
		};


Если вы хотите найти дубликат имена класса B (A класс игнорируется) на всю lstA, попробовать это:
var lstDocumentsWithError = lstA
    .SelectMany(x=>x.lstB)
    .GroupBy(x => x.Name)
    .Where(grp=>grp.Count()>1)
    .Select(grp=> new {Name = grp.Key, Count = grp.Count()})
    .ToList();


Результат:
Name Count
A    2 
D    2 
E    2 
F    3 
H    3


Но если вы хотите сравнить имена только внутри класса A, вы должны изменить приведенный выше код на:
var lstDocumentsWithError1 = lstA
    .SelectMany(x => 
			x.lstB.GroupBy(y=>y.Name)
				.Where(grp=>grp.Count()>1)
				.Select(z=> new
					{
						AID = x.ID,
						Name = z.Key,
						Count = z.Count()
					})
		);


Результат:
AID Name Count
1    A    2 
2    E    2 
2    F    2 
3    H    3


George Swan

Отличное хорошо построенное решение, +5

0x01AA

Ого в 5

Maciej Los

- Спасибо, Джордж.

Maciej Los

Спасибо, Бруно.