假设我们有一个对象列表(为了更清楚,没有使用属性 etc.pp)
public class SomeObject{
public bool IsValid;
public int Height;
}
List<SomeObject> objects = new List<SomeObject>();
现在我只想要一个列表中的值,它既有效又具有最低高度。
传统上我会使用类似的东西:
SomeObject temp;
foreach(SomeObject so in objects)
{
if(so.IsValid)
{
if (null == temp)
temp = so;
else if (temp.Height > so.Height)
temp = so;
}
}
return temp;
我在想用 LinQ 可以更清楚地完成它。
我想到的第一个方法是:
List<SomeObject> sos = objects.Where(obj => obj.IsValid);
if(sos.Count>0)
{
return sos.OrderBy(obj => obj.Height).FirstOrDefault();
}
但后来我在想:在 foreach 方法中,我将通过列表进行一次。使用 Linq,我会通过列表进行一次过滤,一次进行排序,即使我不需要完成对列表的排序。
会像
return objects.OrderBy(obj => obj.Height).FirstOrDefault(o => o.IsValid);
还通过列表两次?
这可以以某种方式优化,以便 linw 也只需要在列表中运行一次吗?