列表的交集 [英] Intersection of lists

查看:112
本文介绍了列表的交集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

在Ruby中,这样做是:

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

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

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

我一直惊讶于C#标准库的设计多么糟糕,因为这种问题一直在出现.

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?

推荐答案

您可以使用 Enumerable.Intersect Enumerable.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();
}

这篇关于列表的交集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆