鉴于两个系列A& B,我想输出:
1.他们的内部联系(比如在一个名为Id的领域)
2. A中无法找到的那些元素
3. B中那些在A中找不到的元素
最有效的方法是什么?
当我说A中那些在B中找不到的元素时,我的意思是那些不能与B“内部联合”的元素
答案 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]);
}
}
这是一种可能的方式。无论是否最佳,我都不确定,它能胜任。