304

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
}

しかし、私が達成したいのは反対です。一方のコレクションから、もう一方のコレクションから欠落しているアイテムをリストしたいと思います。

// Assign two arrays.
int[] array1 = { 1, 2, 3 };
int[] array2 = { 2, 3, 4 };
// Call "NonIntersect" 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: 4
}
4

8 に答える 8

413

前述のように、結果として4を取得したい場合は、次のように実行できます。

var nonintersect = array2.Except(array1);

実際の非交差(1と4の両方)が必要な場合は、これでうまくいくはずです。

var nonintersect = array1.Except(array2).Union( array2.Except(array1));

これは最もパフォーマンスの高いソリューションではありませんが、小さなリストの場合は問題なく機能するはずです。

于 2011-04-11T10:56:20.807 に答える
93

使用できます

a.Except(b).Union(b.Except(a));

またはあなたは使用することができます

var difference = new HashSet(a);
difference.SymmetricExceptWith(b);
于 2011-04-11T10:57:16.160 に答える
13

このコードは、各シーケンスを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);
}
于 2011-04-11T11:00:36.737 に答える
6

私はあなたが探しているかもしれないと思いますExcept

Except演算子は、2つのシーケンス間のセットの差を生成します。最初のシーケンスで、2番目に表示されない要素のみが返されます。オプションで、独自の等式比較関数を提供できます。

詳細については、このリンクこのリンク、またはGoogleを確認してください。

于 2011-04-11T10:57:04.210 に答える
4

array1.NonIntersect(array2);

そのような演算子が交差しないLinqには存在しないため、実行する必要があります

を除く->ユニオン->を除く

a.except(b).union(b.Except(a));
于 2014-11-15T12:05:51.810 に答える
2

NonIntersectメソッドが何をするのか(集合論に関して)100%わかりません-それは
B \ A(Aで発生しないBからのすべて)ですか?
はいの場合、Except操作(B.Except(A))を使用できるはずです。

于 2011-04-11T11:01:24.727 に答える
2
/// <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);
    }
}
于 2012-12-03T10:43:00.560 に答える
-1
string left = "411329_SOFT_MAC_GREEN";
string right= "SOFT_MAC_GREEN";

string[] l = left.Split('_');
string[] r = right.Split('_');

string[] distinctLeft = l.Distinct().ToArray();
string[] distinctRight = r.Distinct().ToArray();

var commonWord = l.Except(r, StringComparer.OrdinalIgnoreCase)
string result = String.Join("_",commonWord);
result = "411329"
于 2017-06-09T16:18:27.497 に答える