2011-02-23 28 views
3

对于一个简单的情况,其中class foo有一个成员i,并且我有一个foos集合,比如IEnumerable<Foo> foos,并且我想以集合foo的成员i,比如List<TypeOfi> result我应该使用简单的foreach或Linq从集合中收集数据时

问题:是否最好使用foreach(下面的选项1)或某种形式的Linq(下面的选项2)或其他方法。或者,也许它甚至不值得关注我自己(仅仅选择我的个人偏好)。

选项1

foreach (Foo foo in foos) 
    result.Add(foo.i); 

选项2

result.AddRange(foos.Select(foo => foo.i)); 

对我来说,选择2看起来更干净,但我不知道是否LINQ的太重手的东西,可以用这样一个简单的foreach循环来实现。

寻找所有意见和建议。

回答

6

我比第一个更喜欢第二个选项。但是,除非有理由预先创建List<T>并使用AddRange,否则我会避免它。就个人而言,我会用:

List<TypeOfi> results = foos.Select(f => f.i).ToList(); 

另外,我不一定会甚至使用ToList(),除非你确实需要一个真正的List<T>,或者需要强制执行是立竿见影,而不是推迟。如果你只是需要一个“我”的价值观集合迭代,我会简单地使用:

var results = foos.Select(f => f.i); 
+0

殴打区区分钟或2! – jonezy 2011-02-23 18:19:13

3

我绝对比较喜欢第二个。它更具说明性,更易于理解(至少对我而言)。

LINQ在这里让我们的生活更具说明性,所以即使在这种看似“微不足道”的情况下,我也不会认为它是沉重的交易。只要

var result = foos.Select(f => f.i).ToList(); 

,因为没有数据已经​​result集合中:

正如里德所说,但是,你可以通过提高质量。

3

LINQ是不是重手以任何方式,无论是在foreach和LINQ代码做差不多的,在foreach在第二种情况下只是隐藏起来。

它确实只是一个偏好问题,至少在对象上是如此。如果你的源代码集合是实体查询或不同的事情,那么这是一个完全不同的情况 - 第二种情况会将查询放到数据库中,这样会更加有效。在这种简单的情况下,差异可能不会太大,但是如果您将Where运算符或其他运算符放入其中并使查询不重要,那么linq查询将可能具有更好/更快的性能。

0

我想你也可以只做到

foos.Select(foo => foo.i).ToList<TypeOfi>(); 
相关问题