快速查找List

| 我有两个通用列表。假设它们是
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)     
已邀请:
        将
B
\放在
Anything1
属性上,并放入字典中。然后,您可以遍历
A
\并有效地挑选pick4ѭ\的列表:
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;
  }
}
    
        如果您提到的数据太多,则选择和插入操作的性能如下。 从C#的通用词典中:
Dictionary<int,A>
选择:O(1)(表示复杂度) 加:O(1)[或O(n)] 基于哈希表
SortedDictionary<int,A>
选择:O(log n) 加:O(log n) 基于二叉搜索树
SortedList<int,A>
选择:O(log n)[或O(n)] 添加在) 基于排序的集合(可调整大小的数组) 请注意,如果数据数量相对较少,则选择“ 21”即可。 (根据您的数据大小,以上顺序将重新排列。) 同时,您需要考虑C#中
Collection
类型的容量。
Collection
类型是可调整大小的,因此,如果缺少大小,则将Collection重新创建为比以前更大的大小,然后再次插入元素。这一点告诉您,如果您已经知道Collection的大小,则应该在Collection构造函数中设置容量。     
        在添加到A列表之前,我将使用Map Check检查它是否存在于B列表中     
        这是一种替代方法,可以更有效地利用LINQ,而不仅仅是替换每个
A
中的列表。使用组联接并将每个组中的项目添加到相应的“ 2”。
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);
}
    

要回复问题请先登录注册