我有一个问题。关于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; }
}
我希望有人能够解决问题。
答案 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();