在C#中使用Lambda表达式进行父和子排序

时间:2015-03-04 03:35:58

标签: c# asp.net .net lambda

我目前正在开发一个项目并使用一些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+  

2 个答案:

答案 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是原始数据的可枚举。