列表的交集

发布于 2024-12-16 23:08:42 字数 744 浏览 1 评论 0原文

在 C# 中是否有更好、更优雅、更简洁的方法来获取两个列表的交集?

在 C# 中,计算日期列表交集的方法是:

    public List<DateTime> dates_common(Timeserie ts1, Timeserie ts2)
    {
        var dt1 = new HashSet<DateTime>(ts1.dates);
        var dt2 = new HashSet<DateTime>(ts2.dates);
        dt1.IntersectWith(dt2);
        var dt = new DateTime[dt1.Count];
        dt1.CopyTo(dt);
        return new List<DateTime>(dt);
    }

在 Ruby 中,可以这样做:

def dates_common(ts1, ts2)
    dt1 = ts1.dates.to_set    
    dt2 = ts2.dates.to_set
    return dt1.intersection(dt2).to_a
end

这种笨拙的根本原因是 IEnumerable 与具体容器和数组之间的不对称。

我一直对 C# 标准库的设计如此糟糕感到惊讶,因为此类问题总是出现。

有没有更好的,这意味着更优雅和简洁的方法来做到这一点?

Is there a better, more elegant and concise, way to get the intersection of two lists in C#?

In C# a method to calculate an intersection of list of dates is:

    public List<DateTime> dates_common(Timeserie ts1, Timeserie ts2)
    {
        var dt1 = new HashSet<DateTime>(ts1.dates);
        var dt2 = new HashSet<DateTime>(ts2.dates);
        dt1.IntersectWith(dt2);
        var dt = new DateTime[dt1.Count];
        dt1.CopyTo(dt);
        return new List<DateTime>(dt);
    }

In Ruby one would do this as:

def dates_common(ts1, ts2)
    dt1 = ts1.dates.to_set    
    dt2 = ts2.dates.to_set
    return dt1.intersection(dt2).to_a
end

The root cause of this clunkiness is the asymmetry between IEnumerable and concrete containers and arrays.

I am constantly amazed how badly designed C# standard libraries are as this kind of problems come up all the time.

Is there a better, this means more elegant and concise, way to do this?

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

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

发布评论

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

评论(2

十年九夏 2024-12-23 23:08:42

您可以使用 Enumerable.IntersectEnumerable.ToList 扩展方法如下,得到非常优雅简洁的代码:

public List<DateTime> dates_common(Timeserie ts1, Timeserie ts2)
{
    return ts1.dates.Intersect(ts2.dates).ToList();
}

You can use the Enumerable.Intersect and Enumerable.ToList extension methods as follows to get very elegant and concise code:

public List<DateTime> dates_common(Timeserie ts1, Timeserie ts2)
{
    return ts1.dates.Intersect(ts2.dates).ToList();
}
蓝眼泪 2024-12-23 23:08:42
    // This function is used to remove those alias from 'cc' which are common in 'to' and 'cc' list.

    private static void RemoveCommonFromCc(ref List<string> to, ref List<string> cc)
    {
        IEnumerable<string> common = (List<string>)to.Intersect(cc);
        foreach(var removeCc in common)
        {
            cc.Remove(removeCc);
        }
    }
    // This function is used to remove those alias from 'cc' which are common in 'to' and 'cc' list.

    private static void RemoveCommonFromCc(ref List<string> to, ref List<string> cc)
    {
        IEnumerable<string> common = (List<string>)to.Intersect(cc);
        foreach(var removeCc in common)
        {
            cc.Remove(removeCc);
        }
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文