2010-09-30 43 views
3

我对LINQ比较陌生,不知道如何做一个Order By。我有一个IEObject的IEnumerable列表,并且想要做类似select first myObject from myObjectList order by myObject.id asc的事情我该怎么做到这一点?谢谢LINQ排序依据选择最低索引

+1

请您澄清一下吗?你真的*需要订购的结果,还是只有最低ID的结果?你需要该条目的*索引*还是只需要ID? – 2010-09-30 19:10:49

+1

如果您只需要具有最低ID的结果,则有一个MinBy扩展方法的实现[此处](http://stackoverflow.com/questions/914109/how-to-use-linq-to-select-object -with-最小或最大值特性值)。它是由一些小伙子写的,虽然我从来没有听说过(他的名字叫Jon Skeet,或者类似的东西),所以我不知道我有多信任它。 – 2010-09-30 20:22:09

+0

@Jon ...有些清晰。我需要列表中具有最低ID的对象。 – MikeTWebb 2010-10-01 19:20:40

回答

4

升序是按方向默认的顺序。

var query = from myObject in myObjectList 
      orderby myObject.id 
      select myObject; 

Object o = query.FirstOrDefault(); 

如果你想降序,你会想要使用orderby myObject.id descending

2
var obj = myObjects.OrderBy(o => o.id).First(); 
0

升序是默认的,如果你想反向只是用OrderByDescending()

var obj = myObjectList.OrderBy(x => x.id).First(); 

,如果你需要的ID或对象的某些其他属性,你可以保持相同的线

int myID = myObjectList.OrderBy(x => x.id).First().id; 
2

使用First方法。

例如:

var data = (from o in Orders 
      order by o.OrderID 
      select o.Name).First(); 
0

您的查询应该看起来像以下:

var yourquery = (from myObject in myObjectList 
       orderby myObject.id 
       select myObject).First(); 

现在变量yourquery包含您所需要的对象。

1

如果您想要ID最低的项目,则不需要OrderBy ...只需枚举一次列表要快得多,因为此操作的复杂性为O(n),而典型的排序具有O(n log n)的复杂性。你可以用foreach循环做,或者使用扩展方法像这样的:

public static T WithMin<T, TValue>(this IEnumerable<T> source, Func<T, TValue> selector) 
    { 
     var min = default(TValue); 
     var withMin = default(T); 
     bool first = true; 
     foreach (var item in source) 
     { 
      var value = selector(item); 
      int compare = Comparer<TValue>.Default.Compare(value, min); 

      if (compare < 0 || first) 
      { 
       min = value; 
       withMin = item; 
      } 
      first = false; 
     } 
     return withMin; 
    } 

使用它这样的:

var objectWithMinId = myObjectList.WithMin(o => o.Id); 
+0

如果后备存储(例如SQL)具有索引并且LINQ可以利用该索引,该怎么办?枚举全套类似于全表扫描。 – magma 2015-07-08 00:50:41

+0

@magma,是的,但在这种情况下,支持商店是内存收藏非常明显,所以我在考虑到这一点后写下了我的答案。如果后备存储是数据库,则最好执行OrderBy并获取第一个项目。 – 2015-07-08 08:07:55

+0

内存中,这是一个伟大的提示! – magma 2015-07-09 00:09:35

0

我宁愿在地方首先使用FirstOrDefault()() ,如果你的查询没有返回任何元素,那么First()将抛出一个异常。

var myObj = (from myObject in myObjectList orderby myObject.id select myObject).FirstOrDefault();