Intersectは、次のように2つのコレクション間の一致を見つけるために使用できます。
// Assign two arrays.
int[] array1 = { 1, 2, 3 };
int[] array2 = { 2, 3, 4 };
// Call Intersect extension method.
var intersect = array1.Intersect(array2);
// Write intersection to screen.
foreach (int value in intersect)
{
Console.WriteLine(value); // Output: 2, 3
}
しかし、私が達成したいのは逆で、2つのコレクションを比較するときに欠落しているアイテムをリストしたいと思います:
// Assign two arrays.
int[] array1 = { 1, 2, 3 };
int[] array2 = { 2, 3, 4 };
// Call Intersect extension method.
var intersect = array1.NonIntersect(array2); // I've made up the NonIntersect method
// Write intersection to screen.
foreach (int value in intersect)
{
Console.WriteLine(value); // Output: 1, 4
}
前述のように、結果として4を取得したい場合は、次のようにできます。
var nonintersect = array2.Except(array1);
実際の交差点(1と4の両方)が必要な場合は、次のトリックが必要です。
var nonintersect = array1.Except(array2).Union( array2.Except(array1));
これは最もパフォーマンスの高いソリューションではありませんが、小さなリストの場合は問題なく機能するはずです。
使用できます
a.Except(b).Union(b.Except(a));
または、使用できます
var difference = new HashSet(a);
difference.SymmetricExceptWith(b);
このコードは各シーケンスを1回だけ列挙し、Select(x => x)
を使用して結果を非表示にして、クリーンなLinqスタイルの拡張メソッドを取得します。ハッシュが適切に分散されている場合、HashSet<T>
を使用するため、ランタイムはO(n + m)
です。いずれかのリストの重複する要素は省略されます。
public static IEnumerable<T> SymmetricExcept<T>(this IEnumerable<T> seq1,
IEnumerable<T> seq2)
{
HashSet<T> hashSet = new HashSet<T>(seq1);
hashSet.SymmetricExceptWith(seq2);
return hashSet.Select(x => x);
}
あなたのNonIntersectメソッドが何をすべきかを100%確信していません(集合論に関して)-それは
B\A(Aで発生しないBのすべて)?
はいの場合、Except操作(B.Except(A))を使用できるはずです。
/// <summary>
/// Given two list, compare and extract differences
/// http://stackoverflow.com/questions/5620266/the-opposite-of-intersect
/// </summary>
public class CompareList
{
/// <summary>
/// Returns list of items that are in initial but not in final list.
/// </summary>
/// <param name="listA"></param>
/// <param name="listB"></param>
/// <returns></returns>
public static IEnumerable<string> NonIntersect(
List<string> initial, List<string> final)
{
//subtracts the content of initial from final
//assumes that final.length < initial.length
return initial.Except(final);
}
/// <summary>
/// Returns the symmetric difference between the two list.
/// http://en.wikipedia.org/wiki/Symmetric_difference
/// </summary>
/// <param name="initial"></param>
/// <param name="final"></param>
/// <returns></returns>
public static IEnumerable<string> SymmetricDifference(
List<string> initial, List<string> final)
{
IEnumerable<string> setA = NonIntersect(final, initial);
IEnumerable<string> setB = NonIntersect(initial, final);
// sum and return the two set.
return setA.Concat(setB);
}
}
array1.NonIntersect(array2);
交差しないそのような演算子はLinqには存在しません
を除く->ユニオン->を除く
a.except(b).union(b.Except(a));