鉴于两个系列A& B:想要输出内连接,A中不在B中的元素,B中不在A中的元素

时间:2011-03-03 02:09:17

标签: c# linq

鉴于两个系列A& B,我想输出:
1.他们的内部联系(比如在一个名为Id的领域) 2. A中无法找到的那些元素 3. B中那些在A中找不到的元素 最有效的方法是什么?

当我说A中那些在B中找不到的元素时,我的意思是那些不能与B“内部联合”的元素

3 个答案:

答案 0 :(得分:4)

对于内部联接,请查看.Join()扩展方法:http://msdn.microsoft.com/en-us/library/bb344797.aspx

对于后两个输出,请查看.Except()扩展方法。 http://msdn.microsoft.com/en-us/library/bb300779.aspx

有关大多数LINQ查询的示例,请查看此页面:http://msdn.microsoft.com/en-us/vcsharp/aa336746

答案 1 :(得分:0)

我想我会写这个:

public class DeltaSet<T>
{
    public ISet<T> FirstItems { get; private set; }
    public ISet<T> SecondItems { get; private set; }
    public ISet<Tuple<T, T>> IntersectedItems { get; private set; }

    // T is the type of the objects, U is the key used to determine equality
    public static DeltaSet<T> GetDeltaSet<T, U>(IDictionary<U, T> first,
                                                IDictionary<U, T> second)
    {
        var firstUniques = new HashSet<T>(
            first.Where(x => !second.ContainsKey(x.Key)).Select(x => x.Value));

        var secondUniques = new HashSet<T>(
            second.Where(x => !first.ContainsKey(x.Key)).Select(x => x.Value));

        var intersection = new HashSet<Tuple<T, T>>(
            second.Where(x => first.ContainsKey(x.Key)).Select(x =>
                Tuple.Create(first[x.Key], x.Value)));

        return new DeltaSet<T> { FirstItems = firstUniques,
                                 SecondItems = secondUniques,
                                 IntersectedItems = intersection };
    }

    public static DeltaSet<IDClass> GetDeltas(IEnumerable<IDClass> first,
                                              IEnumerable<IDClass> second)
    {
        return GetDeltaSet(first.ToDictionary(x => x.ID),
                           second.ToDictionary(x => x.ID));
    }
}

答案 2 :(得分:0)

假设您在集合B中的元素A和集合B中的B类

class AB {
  public A PartA;
  public B PartB;
  // Constructor
};

public void ManyJoin (List<A> colA, List<B> colB)
{
  List<AB> innerJoin = new List<AB>();
  List<A> leftJoin = new List<A>();
  List<B> rightJoin = new List<B>();
  bool[] foundB = new bool[colB.Count];

  foreach (A itemA in colA)
  {
    int i = colB.FindIndex(itemB => itemB.ID == itemA.ID);
    if (i >= 0)
    {
      innerJoin.Add (new AB(itemA, colB[i]));
      foundB[i] = true;
    }
    else
      leftJoin.Add(itemA);
  }

  for (int j = 0; j < foundB.count; j++)
  {
    if (!foundB[j])
      rightJoin.Add(colB[j]);
  }
}

这是一种可能的方式。无论是否最佳,我都不确定,它能胜任。