Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中的数组上执行集减法?_C#_Arrays_Set Operations - Fatal编程技术网

如何在C#中的数组上执行集减法?

如何在C#中的数组上执行集减法?,c#,arrays,set-operations,C#,Arrays,Set Operations,给定C#中的两个数组,执行集减法的最简单方法是什么?显然这是用红宝石做的。基本上,我只想从数组a中删除数组b中的元素: string[] a = new string[] { "one", "two", "three", "four" }; string[] b = new string[] { "two", "four", "six" }; string[] c = a - b; // not valid c应等于{“一”、“三”}b-a将产生{“six”}如果您使用的是Linq,您可以这样

给定C#中的两个数组,执行集减法的最简单方法是什么?显然这是用红宝石做的。基本上,我只想从数组
a
中删除数组
b
中的元素:

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

c
应等于
{“一”、“三”}
b-a
将产生
{“six”}

如果您使用的是Linq,您可以这样使用:

string [] c = a.Except(b).ToArray();
编辑:CodeInChaos很有道理。如果
a
包含重复项,它也将删除所有重复项。使其功能与Ruby版本完全相同的替代方案是:

string [] c = a.Where(x=>!b.Contains(x)).ToArray();
公共静态IEnumerable减号(此IEnumerable enum1,IEnumerable enum2)
{
字典元素=新字典();
foreach(枚举2中的变量el)
{
int num=0;
元素。TryGetValue(el,out num);
元素[el]=num+1;
}
foreach(枚举1中的变量el)
{
int num=0;
if(elements.TryGetValue(el,out num)&&num>0)
{
元素[el]=num-1;
}
其他的
{
收益率;
}
}
}
这不会从enum1中删除重复项。要明确的是:

  • {'A',A'}-{'A'}=={'A'}
  • {'A','A'}-{'A'}=={}

  • 我做第一个,可枚举。第二个除外。

    注意,这将只返回唯一的元素。因此,如果在
    a
    中有一个元素两次,它将只保留第一个元素。太好了,谢谢——我不知道我怎么会错过它。我猜这个名字让我很扫兴。另一种方法会删除重复项!请注意,您的可选代码是
    O(a.Length*b.Length)
    。为了加快速度,你需要从
    b
    @xanatos中构造一个
    HashSet
    ——这是正确的行为,从a中删除b中的所有元素。另一方面,我的替代方法是{b','b'}-{a'}={b','b'}
    元素。删除
    应该是
    元素。包含
    @Keltex,这个想法是,你想删除它,因为它已经被计算过了。然而,我认为它应该是一个
    列表
    而不是
    哈希集
    ,因为它不会解释
    {a,a,a}
    -
    {a,a}
    =
    {a}
    。不,它应该是一个字典,所以我仍然和Linq在一个O(m*log(n))(技术上可能是O((m+1)*log(n)),您只需执行
    var elements=enum2.GroupBy(el=>el.ToDictionary(elg=>elg.Key,elg=>elg.Count())
    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;
            }
        }
    }