简体   繁体   中英

using group by in linq nested list c#

I am using a linq c# query to group distict combination based on Library and books. I have list of Libraries and list of Books inside each library Input 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>

Expected 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>

Please note that the books combination in 1st record and 2nd record are same ie with LibraryCode value'1' and '2'.Though it could be distict,I require only one Library record('1' or '2') based on BookID as the book records are same for 1st and 2nd record Similarly for the 4th and 5th records,I need only one and I require the 5th library record as it is a different combination with Library and Books. Here Library and Books are lists. Code I am using

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

This seems not working. Any help would be much appreciated . thanks

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

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

Indeed, you compare two collections of book ids by reference. I guess the custom comparer would be more appropriate in this case, you should add it as a second parameter after group by key selector.

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;
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM