2011-02-17 25 views
3

我目前有一個對象叫做Week。一週是季節對象的一部分。本賽季可能會包含數週。我想要做的就是找到我一週的位置(是它的第一個星期在本賽季(所以#1),或者是它的第二個(所以#2)。在linq集合中獲取對象位置的整潔方式

int i = 0; 
     foreach (var w in Season.Weeks.OrderBy(w => w.WeekStarts)){ 
      if(w.Id == Id){ 
       return i; 
      } 
      i+=1; 
     } 

目前,這是我有,我在一秒鐘之內按照開始日期排序,以確保它們的順序是正確的,然後循環遍歷它們,直到找到與我目前正在查看的周相匹配的那個星期,然後返回int已計數..

我覺得應該有一個更簡單LINQ的方式來做到這一點,因爲它感覺很凌亂!

回答

5

如果你不喜歡寫FindIndex擴展方法或排序項加載到一個數組/列表,你可以使用的Select提供的索引中的過載項目:

return Season.Weeks 
       .OrderBy(w => w.WeekStarts) 
       .Select((week, index) => new { Week = week, Index = index }) 
       .First(a => a.Week.Id == Id) 
       .Index; 

如果沒有保證指定Id會存在,使用FirstOrDefault代替:

var weekIndexTuple = Season.Weeks 
          .OrderBy(w => w.WeekStarts) 
          .Select((week, index) => 
            new { Week = week, Index = index }) 
          .FirstOrDefault(a => a.Week.Id == Id); 

if(weekIndexTuple != null) 
{ 
    return weekIndexTuple.Index; 
} 
else 
{ 
    // I'm not sure how you want to continue in this case. 
    ...  
} 
+0

+1:只需幾秒鐘就能擊敗我! – StriplingWarrior 2011-02-17 23:27:16

2

以下解答一個非常類似的問題:How to get the index of an element in an IEnumerable?

很多問題的答案都非常相似,你已經做的方式它。將邏輯放到擴展方法中以分離問題並更容易重用可能是一個好主意。下面是從上面的鏈接馬克Gravell代碼:

public static int IndexOf<T>(this IEnumerable<T> source, T value) 
{ 
    int index = 0; 
    var comparer = EqualityComparer<T>.Default; // or pass in as a parameter 
    foreach (T item in source) 
    { 
     if (comparer.Equals(item, value)) return index; 
     index++; 
    } 
    return -1; 
}