列表的交集

iha*_*ems 4 c# ruby intersection list

是否有更好,更优雅和简洁的方法来获得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);
    }
Run Code Online (Sandbox Code Playgroud)

在Ruby中,可以这样做:

def dates_common(ts1, ts2)
    dt1 = ts1.dates.to_set    
    dt2 = ts2.dates.to_set
    return dt1.intersection(dt2).to_a
end
Run Code Online (Sandbox Code Playgroud)

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

我不断惊讶于C#标准库的设计非常糟糕,因为这种问题一直存在.

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

dtb*_*dtb 17

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

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

  • 不包括linq说,"除了更好的方法之外,为什么没有更好的方法来做到这一点?" (8认同)