18

C#で2つの配列を指定して集合減算を実行する最も簡単な方法は何ですか? どうやら、これはRubyでは簡単です。a基本的に、配列内にある配列から要素を削除したいだけですb:

string[] a = new string[] { "one", "two", "three", "four" };
string[] b = new string[] { "two", "four", "six" };
string[] c = a - b; // not valid

c等しいはず{ "one", "three" }です。b - aお譲りいたし{ "six" }ます。

4

2 に答える 2

40

Linq を使用している場合は、次のようにExcept 演算子を使用できます。

string [] c = a.Except(b).ToArray();

編集: CodeInChaos は良い点です。重複が含まれている場合aは、重複も削除されます。Ruby バージョンとまったく同じように機能させる別の方法は次のとおりです。

string [] c = a.Where(x=>!b.Contains(x)).ToArray();
于 2011-02-20T17:22:31.407 に答える
4
public static IEnumerable<T> Minus<T>(this IEnumerable<T> enum1, IEnumerable<T> enum2)
{
    Dictionary<T, int> elements = new Dictionary<T, int>();

    foreach (var el in enum2)
    {
        int num = 0;
        elements.TryGetValue(el, out num);
        elements[el] = num + 1;
    }

    foreach (var el in enum1)
    {
        int num = 0;
        if (elements.TryGetValue(el, out num) && num > 0)
        {
            elements[el] = num - 1;
        }
        else
        {
            yield return el;
        }
    }
}

これは、enum1 から重複を削除しません。明確にするために:

  1. { 'A', 'A' } - { 'A' } == { 'A' }
  2. { 'A', 'A' } - { 'A' } == { }

私は最初を行い、Enumerable.Except は 2 番目を行います。

于 2011-02-20T17:34:40.993 に答える