C#.netを使用して2つの配列文字列を比較するには? 例えば:
string[] com1 = { "COM6", "COM7" };
string[] com2 = { "COM6", "COM7","COM8" };
ここで、com1 と com2 は配列文字列です。結果: COM8. これを達成する方法は?
にあるものを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
だけ返します。COM8
array2
Linq Except 拡張機能の使用:
IEnumerable<string> result = com2.Except(com1);
// result: { "COM8" }
IEnumerable.Exceptを使用できます。
これが最短の解決方法だと思います
foreach (string com in com2 )
{
if (!com1.Contains(com))
{
MessageBox.Show(com);
}
}