2012-11-04 89 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]; 
      }