如何在 C# 中对数组执行集合减法?

发布于 2024-10-18 01:55:13 字数 483 浏览 8 评论 0原文

在 C# 中给定两个数组执行集合减法的最简单方法是什么?显然,这在 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", "三”}b - a 将产生 { "six" }

What's the simplest way to perform a set subtraction given two arrays in C#? Apparently this is dead easy in Ruby. Basically I just want to remove the elements from array a that are in array b:

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

c should equal { "one", "three" }. b - a would yield { "six" }.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

南城旧梦 2024-10-25 01:55:13

如果您使用的是 Linq,则可以使用 Except 运算符,例如这个:

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

编辑: CodeInChaos 提出了一个很好的观点。如果 a 包含重复项,它也会删除所有重复项。使其功能与 Ruby 版本完全相同的替代方法是:

string [] c = a.Where(x=>!b.Contains(x)).ToArray();

If you're using Linq, you can use the Except operator like this:

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

Edit: CodeInChaos makes a good point. If a contains duplicates, it will remove any duplicates as well. The alternative to make it function exactly like the Ruby version would be this:

string [] c = a.Where(x=>!b.Contains(x)).ToArray();
陌上青苔 2024-10-25 01:55:13
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 执行第二个操作。

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;
        }
    }
}

This won't remove duplicates from enum1. To be clear:

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

I do the first, Enumerable.Except does the second.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文