列表的交集
在 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# 标准库的设计如此糟糕感到惊讶,因为此类问题总是出现。
有没有更好的,这意味着更优雅和简洁的方法来做到这一点?
Is there a better, more elegant and concise, way to get the intersection of two lists in 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);
}
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
The root cause of this clunkiness is the asymmetry between IEnumerable and concrete containers and arrays.
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?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以使用 Enumerable.Intersect 和 Enumerable.ToList 扩展方法如下,得到非常优雅简洁的代码:
You can use the Enumerable.Intersect and Enumerable.ToList extension methods as follows to get very elegant and concise code: