列表的交集

时间:2011-11-18 15:41:32

标签: c# ruby list intersection

是否有更好,更优雅,更简洁的方法来获取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#标准库设计糟糕,因为这种问题一直存在。

有没有更好的,这意味着更优雅和简洁,这样做的方式?

2 个答案:

答案 0 :(得分:17)

您可以按照以下方式使用Enumerable.IntersectEnumerable.ToList extension methods来获得非常优雅和简洁的代码:

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

答案 1 :(得分:0)

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