我目前正在开发一个项目并使用一些lambda表达式(基础知识)。我有这个要求,我需要根据层次结构(父和子)显示数据。
当前课程:
public class Phones
{
public int ID { get; set; }
public string Phone { get; set; }
public int ChildOf { get; set; }
}
当前数据
ID Phone ChildOf
1 Samsung 0
2 Apple 0
3 GalaxyS3 1
4 GalaxyS4 1
5 5S 2
6 iPhone 6+ 2
我期待的结果是:
结果
**Samsung**
GalaxyS3
GalaxyS4
**Apple**
5S
iPhone6+
答案 0 :(得分:1)
您可以使用linq执行此操作,如下所示。
var result = phoneList.Where(x=>x.ChildOf!=0).GroupBy(x=>x.ChildOf).Select(g=> new {Key = phoneList.FirstOrDefault(x=>x.ChildOf==0 && x.ID ==g.Key).Phone,Value = g.Select(x => x.Phone)});
但请注意,phoneList.FirstOrDefault(x=>x.ChildOf==0)
这种情况正好发生,因为您需要Phone Name
作为分组密钥。
您可以使用单独的字典来获取值并使用它。但是如果您有父ID,那么为什么要使用该名称。您可以在需要时使用组密钥来使用父ID。如果你这样做,
var result = phoneList.Where(x=>x.ChildOf!=0).GroupBy(x=>x.ChildOf).Select(g=> g.Key,g.ToList());
当你需要在UI上显示它时只需用匹配的父ID替换Key。这会降低很多性能成本。
答案 1 :(得分:0)
这样的事情就足够了:
var lookup = phoneData.Where(e => e.ChildOf == 0)
.ToDictionary(id => id.Id, value => value.Phone);
var result = phoneData.Where(e => e.ChildOf > 0)
.GroupBy(e => lookup[e.ChildOf])
.Select(g => new { Parent = g.Key, Children = g.Select(x => x.Phone) });
phoneData
是原始数据的可枚举。