列表的交集
本文关键字:列表 | 更新日期: 2023-09-27 18:15:02
在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#标准库的设计有多么糟糕,因为这类问题总是出现。
有没有更好的,也就是更优雅简洁的方法?
可以使用Enumerable。相交和枚举。按照以下方式列出扩展方法,以获得非常优雅和简洁的代码:
public List<DateTime> dates_common(Timeserie ts1, Timeserie ts2)
{
return ts1.dates.Intersect(ts2.dates).ToList();
}
// 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);
}
}