24

C#.netを使用して2つの配列文字列を比較するには? 例えば:

string[] com1 = { "COM6", "COM7" };
string[] com2 = { "COM6", "COM7","COM8" };

ここで、com1 と com2 は配列文字列です。結果: COM8. これを達成する方法は?

4

6 に答える 6

55

にあるものをarray2 除いて、すべてを入れたいようですねarray1:

var onlyInArray2 = array2.Except(array1);

もちろん、あなたが使用できるものだけを知りたい場合は、次のようにします。array1

var onlyInArray1 = array1.Except(array2);

(これにはすべて、.NET 3.5 以降、または LINQBridge などの代替の LINQ to Objects 実装が必要です。)

違いを計算するときに順序は重要ではないと想定しています-Exceptはセットベースの演算子であるため、コレクションをセットと見なしていると想定しています。

Except-を返すだけであることに注意してくださいIEnumerable<T>。結果を配列として取得する場合は、次のように呼び出す必要がありますToArray

var onlyInArray2 = array2.Except(array1).ToArray();
var onlyInArray1 = array1.Except(array2).ToArray();

対称的な違いが必要な場合、つまり、値がどの配列から来たかではなく、単一の配列にある値のみを気にする場合は、次を使用できます。

var onlyInOneArray = array1.Union(array2).Except(array1.Intersect(array2));

または、直接使用できますHashSet

var set = new HashSet<string>(array1);
// This modifies the set...
set.SymmetricExceptWith(array2);

これらすべてにおいて、結果の順序は定義されていませんが、実際Exceptには最初の引数の元の順序が保持されます。これは厳密に言えば実装の詳細ですが、変更される可能性はほとんどないと思います。

LINQ の他のセットベースの演算子と同様に、は任意の要素を 1回Exceptだけ返します。COM8array2

于 2012-06-12T06:26:12.120 に答える
19

Linq Except 拡張機能の使用:

IEnumerable<string> result = com2.Except(com1); 
// result: { "COM8" }
于 2012-06-12T06:24:29.033 に答える
10

IEnumerable.Exceptを使用できます。

于 2012-06-12T06:25:20.937 に答える
7

これが最短の解決方法だと思います

foreach (string com in com2 )
{
    if (!com1.Contains(com))
    {
        MessageBox.Show(com);
    }
}
于 2012-06-12T07:22:31.493 に答える
3

Union両方ではなく 1 つのリストにあるすべてのものを 1 つの式で使用する場合は、 , andを使用できます。Intersect Except

var inOnlyOneArray = array1.Union(array2).Except(array1.Intersect(array2));
于 2012-06-12T06:28:49.937 に答える