快速查找List <t> </t>

时间:2011-06-21 22:40:14

标签: c# .net list lookup

我有两个通用列表。我们说它们是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)

4 个答案:

答案 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;插入操作的顺序如下。

来自Generic Dictionaries in C#

  1. Dictionary<int,A>

    • 选择:O(1)(表示复杂性)
    • 添加:O(1)[或O(n)]
    • 基于哈希表
  2. SortedDictionary<int,A>

    • 选择:O(log n)
    • 添加:O(log n)
    • 基于二叉搜索树
  3. SortedList<int,A>

    • 选择:O(log n)[或O(n)]
    • 添加:O(n)
    • 基于已排序的集合(大小数组)
  4. 请注意,如果数据的数量相对较小,则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);
}