如何在C#中的数组上执行集减法?
给定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,您可以这样
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
中有一个元素两次,它将只保留第一个元素。太好了,谢谢——我不知道我怎么会错过它。我猜这个名字让我很扫兴。另一种方法会删除重复项!请注意,您的可选代码是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;
}
}
}