2012-11-04 229 views
0

假設我有一個名爲TheListOfMyObjects的對象列表。在該列表中,有一個屬性值匹配值爲的對象:MyObject.TheProperty = SomeValue從列表中獲取元素索引

如何從此列表中獲取前3個對象和下3個對象?

請注意,如果匹配SomeValue的對象處於第一個位置,那麼我需要位置2-5中的3個對象和最後3個位置中的3個對象共6個對象。

感謝您的建議。

+1

[你嘗試過什麼(http://whathaveyoutried.com )? – Oded

+0

我嘗試通過將每個元素與foreach循環一起推入數組,將列表轉換爲數組。現在我有一個索引數組,但我想知道是否有一個更短的基於LINQ的方法。 – frenchie

+0

如果您正在使用'IList ',您可以通過索引來訪問它。使用LINQ,你可以看看使用'Take'(假設你有初始索引)。但是你沒有提到列表變量的類型,也沒有提到你想要一個LINQ實現。 – Oded

回答

3

試試這個:

var theObj = TheListOfMyObjects.First(x => x.TheProperty == someValue); 
var index = TheListOfMyObjects.IndexOf(theObj); 
//and from there it's obvious. 

萬一有一個機會,名單將不包含這樣的元素,使用FirstOrDefault和檢查空上theObj。

+1

請注意,只有當對象使用(默認)引用相等時,這纔是正確的。否則,這可能會導致負面和正面的意外。查看IEQuatable sehe

+1

好的,謝謝;這給了我一個想法:只需將另一個列表添加到相同的現有列表中,這樣我就不必處理值位於列表開頭或結尾的邊界情況。 – frenchie

1

對不起,我的電腦出現了問題。您不必添加另一個列表,就可以解決邊緣例這樣的事情,如果你的列表中有至少7個對象:

  MyObject mo = list.FirstOrDefault(x => x.TheProperty.Equals(SomeValue)); 
      if(mo != null) 
      { 
       int index = list.IndexOf(mo); 
       MyObject moMinus3 = list[(index - 3 + list.Count) % list.Count]; 
       MyObject moMinus2 = list[(index - 2 + list.Count) % list.Count]; 
       MyObject moMinus1 = list[(index - 1 + list.Count) % list.Count]; 
       MyObject mo0 = list[index]; 
       MyObject moPlus1 = list[(index + 1 + list.Count) % list.Count]; 
       MyObject moPlus2 = list[(index + 2 + list.Count) % list.Count]; 
       MyObject moPlus3 = list[(index + 3 + list.Count) % list.Count]; 
      }