使用linq和c#从平面列表对象

时间:2017-04-26 05:31:08

标签: c# linq

我有一个问题。关于linq和c#的结合。 我想从预定义的对象结构中的展平结构创建树结构。

以下代码我已经开始工作,但两者都不是我想要的。

在linq:

     var result = listAgenderingen.GroupBy(records => records.Agnnummer)
                    .Select(group => new { AgnNummer = group.Key, Items = group.ToList()}).ToList();

问题是这不会产生我想要的对象。 所以我将此重写为以下代码

            List<string> test = listAgenderingen.Select(x => x.Agnnummer).Distinct().ToList();
        foreach (var item in test)
        {
            List<Agendering> listAgendering = listAgenderingen.Where(agend => agend.Agnnummer == item).OrderBy(ord => ord.Agnnummer).ToList();
            AgnAgendering AgnAgendering = new AgnAgendering() {AgnNummer =item, Agenderingen = listAgendering };
        }

这段代码实际上是正确的。但对于200000条记录,它需要花费大量时间,而最初的linq需要几秒钟。

我的问题是可以重写linq以便创建或转换为richt对象吗?

类的结构:

    public class Agendering
{
    public int AgnID { get; set; }
    public string Agnnummer { get; set; }
}

   public class AgnAgendering
{
    public string AgnNummer { get; set; }
    public List<Agendering> Agenderingen { get; set; }
}

我希望有人能够解决问题。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你想:

 var result = listAgenderingen.GroupBy(records => records.Agnnummer)
                .Select(group => new AgnAgendering { AgnNummer = group.Key, Agenderingen = group.ToList()}).ToList();

答案 1 :(得分:1)

您的属性命名使其绝对不可读且不清楚。

假设你有一个扁平的结构,如:

public class Item
{
    public int ID { get; set; }
    public int? ParentID { get; set; }
}

你想要一个树状的结构:

public class TreeItem
{
    public int ID { get; set; }
    public TreeItem Parent { get; set; }
    public List<TreeItem> Children { get; set; }

    public TreeItem(int id)
    {
        ID = id;
        Children = new List<TreeItem>();
    }

    public TreeItem(int id, TreeItem parent) : this(id)
    {
        Parent = parent;
    }
}

您可以使用O(n)

Dictionary中做到最佳效果
Item[] items = ...;

Dictionary<int, TreeItem> result = new Dictionary<int, TreeItem>();

foreach (var item in items.OrderBy(x => x.ParentID ?? -1))
{
    TreeItem current; 

    if (item.ParentID.HasValue)
    {
        TreeItem parent = result[item.ParentID]; // guaranteed to exist due to order
        current = new TreeItem(item.ID, parent);            
        parent.Children.Add(current);
    } else {
        current = new TreeItem(item.ID);
    }
}

TreeItem[] treeItems = result.Values.ToArray();