C# Can';I don’我想不出一个好办法来把我的名单按你想要的方式分组

C# Can';I don’我想不出一个好办法来把我的名单按你想要的方式分组,c#,linq,C#,Linq,所以,我有我的模型: Card Department PayDate State 和一个列表,其中加载了多个项目: 1 , 25 , 12-20-2016 , A 1 , 25 , 12-20-2016 , B 1 , 25 , 12-21-2016 , D 1 , 30 , 12-20-2016 , A 1 , 30 , 12-20-2016 , X 2 , 10 , 12-20-2016 , B 2 , 15 , 12-20-2016 , A 2 , 15 , 12-21-2016 , E

所以,我有我的模型:

Card
Department
PayDate
State
和一个列表,其中加载了多个项目:

1 , 25 , 12-20-2016 , A
1 , 25 , 12-20-2016 , B
1 , 25 , 12-21-2016 , D
1 , 30 , 12-20-2016 , A
1 , 30 , 12-20-2016 , X
2 , 10 , 12-20-2016 , B
2 , 15 , 12-20-2016 , A
2 , 15 , 12-21-2016 , E
我想对所有这些项目进行分组,并创建此类型的结构:

Cards
   Card
      1
      Departments
         25
         PayDate
            12-20-2016
            State
               A
               B
            12-21-2016
            State
               D
         30
         PayDate
            12-20-2016
            State
               A
               X

它就像一个XML树,有父标记和它们的子标记(State是PayDate的子标记,PayDate是Department的子标记,等等)


我已经尝试过处理GroupBy()、Distinct()和嵌套的foreach,但是我无法达到我想要的输出。有没有什么简单有效的方法可以做到这一点而不需要中断控制?

这里有一个快速的方法来解决这个问题,它会让你走上正轨。基本思想是,调用GroupBy将按某个键对列表进行分组,而调用select将把该选择的结果(您可以将其视为值)投影到一个新对象。然后,您可以将该概念重新应用于每个子组,以在列表中找到您想要的方法

例如,
list.GroupBy(x=>x.Card)
返回组的
IEnumerable
,每个组的内部是另一个
IEnumerable
模型,但这些模型都有相同的卡。因此,我们获取一个具有相同卡片的所有模型的IEnumerable,并请求一个新的
卡片
对象(同样,我在这里只使用了匿名类型),然后我们通过按部门对剩余条目进行分组等方式来获取部门,直到结束。由于
State
没有子列表,我们只调用
pdd.Select(p=>p.State)
,因为我们只关心状态列表的状态值

我还没有为子类型创建任何类,但是您可能会执行类似于
Select(x=>newdepartment(x.Department))
的操作

类模型
{
公共int卡;
公共事务部;
公共字符串支付日期;
公有制国家;
公共模型(int c、int d、字符串p、字符s)
{
卡=c;
部门=d;
付款日期=p;
状态=s;
}
}
变量列表=新列表
{
新模式(1,25,“12-20-2016”,“A”),
新模式(1,25,“12-20-2016”,“B”),
新模型(1,25,“12-21-2016”,“D”),
新模式(1,30,“12-20-2016”,“A”),
新模型(1,30,“12-20-2016”,“X”),
新模型(2,10,“12-20-2016”,“B”),
新模式(2,15,“12-20-2016”,“A”),
新模式(2,15,“12-21-2016”,“E”)
};
var result=list.GroupBy(x=>x.Card)。选择(z=>
{
还新
{
卡=z键,
departments=z.GroupBy(d=>d.Department)。选择(
dd=>
{
还新
{
部门=dd.Key,
payDates=dd.GroupBy(pd=>pd.PayDate)
.选择(
pdd=>
{
返回新的{paydate=pdd.Key,states=pdd.Select(p=>p.State)};
})
};
})
};
});

?听起来像是一对团员就可以了。请描述一下你的尝试,很难说你还需要什么。你说的“一对小组成员”是什么意思?我刚刚制作了1个GroupBy ant,试图迭代结果,但这可能是我的错误。@bwk4u所需结果基本上是嵌套的
GroupBy
的标准输出-首先是
Card
,然后是每个内部组的
departition
,然后是每个内部组的
PayDate
,所以用LINQ构建它不应该引起问题。在我的模型中改变了一些东西,并设法让它工作。非常感谢,先生。
class Model
{
    public int Card;
    public int Department;
    public string PayDate;
    public char State;

    public Model(int c, int d, string p, char s)
    {
        Card = c;
        Department = d;
        PayDate = p;
        State = s;
    }
}
var list = new List<Model>
{
    new Model(1, 25, "12 - 20 - 2016", 'A'),
    new Model(1, 25, "12 - 20 - 2016", 'B'),
    new Model(1, 25, "12 - 21 - 2016", 'D'),
    new Model(1, 30, "12 - 20 - 2016", 'A'),
    new Model(1, 30, "12 - 20 - 2016", 'X'),
    new Model(2, 10, "12 - 20 - 2016", 'B'),
    new Model(2, 15, "12 - 20 - 2016", 'A'),
    new Model(2, 15, "12 - 21 - 2016", 'E')
};

var result = list.GroupBy(x => x.Card).Select(z => 
{
    return new
    {
        card = z.Key,
        departments = z.GroupBy(d => d.Department).Select(
            dd =>
            {
                return new
                {
                    department = dd.Key,
                    payDates = dd.GroupBy(pd => pd.PayDate)
                        .Select(
                            pdd =>
                            {
                                return new {paydate = pdd.Key, states = pdd.Select(p => p.State)};
                            })
                };
            })
    };
});