我有一个元素列表,我想根据具体情况将元素过滤到其他列表中。我有两种选择:
使用foreach()语句
List<Address> allAddress = new List<Address>();
List<Address> chaplinAddress = new List<Address>();
foreach (Address item in allAddress)
{
if (item.city.ToUpper() == "CHAPLIN")
{
chaplinAddress.Add(item);
}
}
使用Where()子句
List<Address> allAddress = new List<Address>();
List<Address> chaplinAddress = new List<Address>();
chaplinAddress = allAddress.Where(p => p.city.ToUpper() == "CHAPLIN").ToList();
上述哪种方法对性能更好?
我在下面的链接中查找了Where()的执行方式,但我仍然不清楚:
答案 0 :(得分:3)
LINQ无论如何都在内部使用循环...你可以使用.NET Reference Source来检查内部的工作方式:
<强> Enumerable.Where
强>
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
if (source == null) throw Error.ArgumentNull("source");
if (predicate == null) throw Error.ArgumentNull("predicate");
if (source is Iterator<TSource>) return ((Iterator<TSource>)source).Where(predicate);
if (source is TSource[]) return new WhereArrayIterator<TSource>((TSource[])source, predicate);
if (source is List<TSource>) return new WhereListIterator<TSource>((List<TSource>)source, predicate);
return new WhereEnumerableIterator<TSource>(source, predicate);
}
<强> Enumerable.ToList
强>:
public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) {
if (source == null) throw Error.ArgumentNull("source");
return new List<TSource>(source);
}
和WhereListIterator
(作为一个链接,因为这里粘贴有点长...
使用LINQ时会有一点开销,因为代理调用,但是你根本不应该关心。像这样的过早优化是邪恶的,它甚至比它需要的这么小的时间开销更糟糕。
答案 1 :(得分:2)
决定对此进行测试。 1,000,000,000个随机字符串,插入一个“CHAPLIN”。
看起来foreach更快。
编辑:做了更科学的研究。在发布模式下,在VS之外,每次测试1000次。请记住,滴答是百万分之一秒,对于1000,000,000个城市的1000次查找,差异为0.0000004秒。
我认为你是个好人。
答案 2 :(得分:0)
您可以使用计时器对象来检查哪一个更快但是LINQ并不比foreach()快,因为它(LINQ语句)也在内部使用循环。另外值得一提的是,LINQ更容易阅读,理解和阅读。适应更少的错误。但是如果你非常关心性能,就不应该使用LINQ