C# 基于对父项的引用将项添加到列表中
我有两个相同类型的C# 基于对父项的引用将项添加到列表中,c#,linq,C#,Linq,我有两个相同类型的包裹列表 public class Parcel { int Id {get;set;} int RecipientID {get;set;} DateTime CreatedOn {get;set;} } List<Parcel> aparcels = postFacade.GetParcels() .OrderByDescending(x => x.CreatedOn); List&l
包裹列表
public class Parcel
{
int Id {get;set;}
int RecipientID {get;set;}
DateTime CreatedOn {get;set;}
}
List<Parcel> aparcels = postFacade.GetParcels()
.OrderByDescending(x => x.CreatedOn);
List<Parcel> bparcels = postFacade.GetReplyParcels();
有什么方法可以提高此操作的性能吗?它可能会处理成百上千的包裹
对象。我认为这有点过于复杂了
您可以通过原始帖子集合进行简单的循环,并使用以下工具轻松添加所需内容:
foreach(var a in aposts.OrderByDescending(p => p.CreatedOn))
{
parcels.Add(a);
parcels.Add(bposts.Where(b => a.ID == b.RecipientID).OrderByDescending(p => p.CreatedOn));
}
更新
考虑到您希望循环遍历每个bpost回复以获得对它的任何其他回复,我编写了一个迭代方法,该方法将循环直到所有父->子->孙->等都得到解决。这应该会得到你想要的一切基于创建的字段
foreach(var a in aposts.OrderByDescending(p => p.CreatedOn))
{
parcels.Add(a);
foreach(var b in bposts.Where(bpost => bpost.RecipientID == a.ID).OrderByDescending(bpost => bpost.CreatedOn))
{
parcels.AddRange(Iterate(b, bposts));
}
}
public IList<Parcel> Iterate(Parcel a, IList<Parcel> b)
{
var parcels = new List<Parcel>();
foreach(var post in b.Where(bpost => a.ID == bpost.RecipientID).OrderByDescending(bpost => bpost.CreatedOn))
{
parcels.Add(post);
parcels.AddRange(Iterate(post, b));
}
return parcels;
}
foreach(aposts.OrderByDescending(p=>p.CreatedOn)中的变量a)
{
包裹。添加(a);
foreach(bpost.Where(bpost=>bpost.RecipientID==a.ID)中的变量b.OrderByDescending(bpost=>bpost.CreatedOn))
{
包裹。添加范围(迭代(b,bposts));
}
}
公共IList迭代(地块a、IList b)
{
var parcels=新列表();
foreach(b.Where中的var post(bpost=>a.ID==bpost.RecipientID).OrderByDescending(bpost=>bpost.CreatedOn))
{
包裹。添加(邮寄);
包裹。添加范围(迭代(post,b));
}
归还包裹;
}
我认为您应该在字典中存储对包裹本身的引用,它们已经在列表中,这样您就不必从Facade中再次加载它们,这可能会降低代码的速度
List<Parcel> parcels = new List<Parcels>();
var replies = bposts.ToDictionary(u => u.RecipientID);
foreach (var p in aparcels)
{
parcels.Add(p);
Parcel parent = p;
while (replies.TryGetValue(parent.Id, out parent))
{
parcels.Add(parent);
}
}
这行得通吗?听起来好像多个回复
可能具有相同的Id
,这将导致字典中出现DuplicateKeyException
。您能否更改命名约定以使其更易于理解?另外,一个回复
如何引用另一个回复
,收件人Id
=Id
?@CodingGorilla每个Id
都是唯一的,因为它们都是包裹
对象。“回复”另一个包裹的每个包裹
都引用了该包裹
的唯一ID,该包裹使用收件人ID
进行“回复”。这基本上是一个粗略的链表,我试图按照它来确定插入顺序。实际上,我认为您这里的功能应该表现得很好-您是否有特定的性能数字来指示问题?这里的问题是每次调用parcelFacade.GetById(val),即使所有回复包都已加载,因为数据可能位于不同的机器/进程中。这不符合排序或递归添加应答包裹
对象的条件。回复包裹
可能不是在其父项之后立即创建的——创建日期是任意的。另外,一个回复包裹
可能会有另一个包裹
回复它,等等。我需要获取所有回复并将它们添加到列表中,因此您正在寻找一个无限循环来运行回复,以确保每个可能有自己回复的回复都被添加?就像一个“评论”部分。我可以评论你的主要帖子,然后有人可以评论我的评论,然后其他人可以评论他们的评论,等等。好的,明白了。
List<Parcel> parcels = new List<Parcels>();
var replies = bposts.ToDictionary(u => u.RecipientID);
foreach (var p in aparcels)
{
parcels.Add(p);
Parcel parent = p;
while (replies.TryGetValue(parent.Id, out parent))
{
parcels.Add(parent);
}
}
foreach (var p in aparcels)
{
var current = p;
do parcels.Add(current);
while (replies.TryGetValue(current.Id, out current));
}