列表的交集

5

有没有更好、更优雅、更简洁的方法在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#标准库设计得如此糟糕,以至于这种问题一直存在。
是否有更好的方式来解决这个问题?更好指的是更优雅、更简洁的方式。

5
你不知道如何正确使用标准库并不意味着它们的设计不好... 我认为,相反地,它们的设计非常好(嗯,其中大部分都是)。顺便说一下,dtb提出的解决方案与你的Ruby解决方案几乎完全相同。 - Thomas Levesque
2
花10分钟学习LINQ的基础知识,你很快就会发现.Net集合库非常丰富。当我用其他语言编写代码时,我经常会写LINQ方法。 - Eric Andres
使用LINQ的时候有什么不推荐的原因吗?在什么情况下会出现这种情况? - IHMS
除了需要维护旧的、.net3.5之前的代码之外,我看不出任何理由。在某些情况下,使用linq的解决方案很难像使用传统结构一样高效,但我发现这种情况非常罕见。所以,从任何地方获取最好的东西,它可能会改变你的名字为“istilldontlikemsbutsometimesitisnottoobadactually”;)。 - Gert Arnold
2个回答

19

我知道这个,但需要使用 System.Linq;。 - IHMS
System.Linq是自3.5版本起成为.Net框架的一部分。 - WarHog
8
除了Linq之外,这句话的意思是:“为什么没有比现在更好的方法来做这件事?” - user24359

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接