得到清单 在.GroupBy()之后

问题描述 投票:2回答:2

有人可以解释我如何使用GroupBySelect得到这个:

public class BadClass{
    public int id; //can be grouped by id
    public string name; //identical for the same Id
    public bool flag; //identical for the same Id
    public int bId;
    public string bName;
    public int cId;
    public string cName;
}

这一个:List <A>其中:

public class A {
    public int id;
    public string name;
    public bool flag;
    public List<B> bList;
}

public class B {
    public int id;
    public string name;
    public C c;
}

public class C {
    public int id;
    public int name;
}

我在BadClass中做了数据的例子:

List<BadClass> badClass = new List<BadClass>() {
    new BadClass(){ id = 1, name = "A1", flag = true, bId = 1, bName = "B1", cId = 1, cName = "C1" },
    new BadClass(){ id = 1, name = "A1", flag = true, bId = 2, bName = "B2", cId = 3, cName = "C2" },
    new BadClass(){ id = 1, name = "A1", flag = true, bId = 3, bName = "B3", cId = 1, cName = "C1" },
    new BadClass(){ id = 2, name = "A2", flag = false, bId = 4, bName = "B4", cId = 2, cName = "C2" },
    new BadClass(){ id = 2, name = "A2", flag = false, bId = 5, bName = "B5", cId = 3, cName = "C3" }
};

/*
+----+------+-------+-----+-------+-----+-------+
| id | name |  flag | bId | bName | cId | cName |
+----+------+-------+-----+-------+-----+-------+
|  1 |  A1  |  true |  1  |   B1  |  1  |   C1  |
+----+------+-------+-----+-------+-----+-------+
|  1 |  A1  |  true |  2  |   B2  |  1  |   C1  |
+----+------+-------+-----+-------+-----+-------+
|  1 |  A1  |  true |  3  |   B3  |  3  |   C3  |
+----+------+-------+-----+-------+-----+-------+
|  2 |  A2  | false |  4  |   B4  |  2  |   C2  |
+----+------+-------+-----+-------+-----+-------+
|  2 |  A2  | false |  5  |   B5  |  3  |   C3  |
+----+------+-------+-----+-------+-----+-------+
*/

我试着做出类似的东西:

var result = badClass.GroupBy(x => x.id).Select(x => x. ???? ) ???? =(

但不知道如何做对。

更新:

var result = badClass
    .GroupBy(x => x.id)
    .Select(x => new A {
        id = x.Key,
        name = x.First().name,
        flag = x.First().flag,
        bList = x.ToList()
    });

这是bList = x.ToList();中的错误我需要将名称bId更改为id e.t.c.

回答:

var result = badClass
        .GroupBy(x => x.id)
        .Select(x => new A
        {
            id = x.Key,
            name = x.First().name,
            flag = x.First().flag,
            bList = badClass.Where(y => y.id == x.Key).Select(y =>
                new B { id = y.bId, name = y.bName, c = new C { id = y.cId, name = y.cName } }).ToList()
        });
c# select group-by
2个回答
1
投票
var result = badClass
        .GroupBy(x => x.id)
        .Select(x => new A
        {
            id = x.Key,
            name = x.First().name,
            flag = x.First().flag,
            bList = badClass.Where(y => y.id == x.Key).Select(y =>
                new B { id = y.bId, name = y.bName, c = new C { id = y.cId, name = y.cName } }).ToList()
        });

这应该可以满足您的需求

但说实话,我更喜欢foreach循环+ Dictionary的可读性。


3
投票

只需添加一个.Select和ToList,它将包含您需要的所有项目

var result = badClass.GroupBy(x => x.id).Select(x => x.ToList());
© www.soinside.com 2019 - 2024. All rights reserved.