我有两个通用列表。我们说它们是List< A >
和List< B >
。
类A
有一个属性,类型为List< B >
。此属性包含B
类型对象,这些对象由对象A
的其他一些属性进行过滤。
所以:
class A{
public int Something1;
public int Something2;
public List<B> Something3;
}
class B{
public int Anything1;
public int Anything2;
}
我想将所有对象B
作为列表添加到对象A
(名为Something3
的属性),其中我们说对象A.Something1 == B.Anything1
。
我的问题是:将List<B>
项添加到List<A>
项的最有效方法是什么?请注意,两个列表中可能有数十万个对象。
(VS2010; C#; .Net4)
答案 0 :(得分:5)
将B
属性Anything1
分组并放入字典中。然后,您可以遍历A
并有效地选出B
的列表:
Dictionary<int, List<B>> beegroups = bees.GroupBy(b => b.Anything1).ToDictionary(g => g.Key, g => g.ToList());
foreach (A a in ayes) {
List<B> group;
if (beegroups.TryGetValue(a.Something1, out group)) {
a.Something3 = group;
}
}
答案 1 :(得分:2)
如果您提到的数据太多,那么选择&amp;插入操作的顺序如下。
Dictionary<int,A>
SortedDictionary<int,A>
SortedList<int,A>
请注意,如果数据的数量相对较小,则List<int, A>
会很好。
(根据您的数据大小,上面的顺序将重新排列。)
与此同时,您需要考虑C#中<{1}}类型的容量。 Collection
类型是可调整大小的,因此如果缺少大小,则会将Collection重新创建为比以前更大的元素并再次插入元素。这一点告诉您,如果您已经知道Collection的大小,则应该在Collection构造函数中设置容量。
答案 2 :(得分:0)
在添加到A列表
之前,我会使用地图检查它是否存在于B列表中答案 3 :(得分:0)
这是一种更有效地利用LINQ的替代方法,而不仅仅是替换每个A
中的列表。使用群组联接并将每个群组中的项目添加到相应的A
。
List<A> myAs = ...;
List<B> myBs = ...;
var pairs = from a in myAs
join b in myBs on a.Something1 equals b.Anything1 into TheseBs
select new { A = a, TheseBs };
foreach (var pair in pairs)
{
pair.A.Something3.AddRange(pair.TheseBs);
}