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