使用linq嵌套列表c#中的groupby



我使用linq c#查询来对基于Library和books的distict组合进行分组。我有图书馆清单和每个图书馆的图书清单输入XML:

<Libraries>
<LibraryCode value="1">test</LibraryCode>
<LibraryArea>XYZ</LibraryArea>
<Books BookID="Book_ID1">
<BookName>Name1</BookName>
<BookCode code="1">Code1</BookCode>
</Books>
<Books BookID="Book_ID2">
<BookName>Name2</BookName>
<BookCode code="1">Code1</BookCode>
</Books>
</Libraries>
<Libraries>
<LibraryCode value="2">test</LibraryCode>
<LibraryArea>ABC</LibraryArea>
<Books BookID="Book_ID1">
<BookName>Name1</BookName>
<BookCode code="1">Code1</BookCode>
</Books>
<Books BookID="Book_ID2">
<BookName>Name2</BookName>
<BookCode code="1">Code1</BookCode>
</Books>
</Libraries>
<Libraries>
<LibraryCode value="3">test</LibraryCode>
<LibraryArea>ABC</LibraryArea>
<Books BookID="Book_ID3">
<BookName>Name3</BookName>
<BookCode code="3">Code3</BookCode>
</Books>
</Libraries>
<Libraries>
<LibraryCode value="4">test</LibraryCode>
<LibraryArea>ABC</LibraryArea>
<Books BookID="Book_ID3">
<BookName>Name3</BookName>
<BookCode code="3">Code3</BookCode>
</Books>
</Libraries>
<Libraries>
<LibraryCode value="5">test</LibraryCode>
<LibraryArea>ABC</LibraryArea>
<Books BookID="Book_ID5">
<BookName>Name5</BookName>
<BookCode code="5">Code5</BookCode>
</Books>
</Libraries>

预期XML:

<Libraries>
<LibraryCode value="1">test</LibraryCode>
<LibraryArea>XYZ</LibraryArea>
<Books BookID="Book_ID1">
<BookName>Name1</BookName>
<BookCode code="1">Code1</BookCode>
</Books>
<Books BookID="Book_ID2">
<BookName>Name2</BookName>
<BookCode code="1">Code1</BookCode>
</Books>
</Libraries>
<Libraries>
<LibraryCode value="3">test</LibraryCode>
<LibraryArea>ABC</LibraryArea>
<Books BookID="Book_ID3">
<BookName>Name3</BookName>
<BookCode code="3">Code1</BookCode>
</Books>
</Libraries>
<Libraries>
<LibraryCode value="5">test</LibraryCode>
<LibraryArea>ABC</LibraryArea>
<Books BookID="Book_ID5">
<BookName>Name5</BookName>
<BookCode code="5">Code1</BookCode>
</Books>
</Libraries>

请注意,第一条记录和第二条记录中的图书组合相同,即LibraryCode值为"1"one_answers"2"。尽管可能会有所不同,但我只需要一个基于BookID的Library记录('1'或'2'(,因为第一个和第二个记录的图书记录相同同样,对于第4和第5条记录,我只需要一条,我需要第5条图书馆记录,因为它与图书馆和图书的组合不同。这里是图书馆和图书列表。代码我正在使用

var result= libraries.GroupBy(x=>x.Books.Select(s=>s.BookID)).Select(grp=>grp.ToList()).ToList();

这似乎不起作用。任何帮助都将不胜感激。感谢

默认情况下,几乎所有引用类型都是通过引用进行比较的,因此需要自定义比较器来按值进行比较,或者按按值比较的类型分组:

libraries.GroupBy(l => string.Join(",", l.Books.Select(b => b.BookID)))

实际上,您通过引用比较了两个图书id集合。我想自定义比较器在这种情况下会更合适,您应该将其作为第二个参数添加到group-by-key选择器之后。

libraries.GroupBy(x=>x.Books.Select(s=>s.BookID), new BookIdsComparer ())
public class BookIdsComparer : IEqualityComparer<IEnumerable<string>>
{
public bool Equals(IEnumerable<string> bookIds1, IEnumerable<string> bookIds2)
{
return bookIds1.Count() == bookIds2.Count() 
&& bookIds1.Intersect(bookIds2).Count() == bookIds1.Count();
}
public int GetHashCode(IEnumerable<string> bookIds)
{
var result = 1;
foreach (var bookId in bookIds)
{
result ^= bookId.GetHashCode();
}
return result;
}
}

最新更新