【问题标题】:getting index of elements by from a list从列表中获取元素的索引
【发布时间】:2012-11-04 19:24:22
【问题描述】:

假设我有一个名为TheListOfMyObjects 的对象列表。在该列表中,有一个具有与值匹配的属性的对象:MyObject.TheProperty = SomeValue。

如何从该列表中获取前 3 个对象和后 3 个对象?

请注意,如果匹配 SomeValue 的对象位于第一个位置,那么我需要位置 2-5 的 3 个对象和最后 3 个位置的 3 个对象,总共 6 个对象。

感谢您的建议。

【问题讨论】:

  • 我尝试通过将每个元素推入带有 foreach 循环的数组中来将列表转换为数组。现在我有一个带有索引的数组,但我想知道是否有更短的基于 linq 的方法。
  • 如果您使用的是IList<T>,您已经可以通过索引访问它。使用 LINQ,您可以使用 Take 来解决这个问题(前提是您有初始索引)。但是您没有提及列表变量的类型,也没有提及您想要 LINQ 实现。
  • 它实际上是一个时区对象列表。 var TheListOfAllTimezones = TimeZoneInfo.GetSystemTimeZones();
  • 您正在寻找的是一个循环列表。看到这个:stackoverflow.com/questions/716256/…

标签: c#


【解决方案1】:

试试这个:

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

如果列表有可能不包含这样的元素,请使用 FirstOrDefault 并检查 theObj 上的 null。

【讨论】:

  • 请注意,只有当对象使用(默认)引用相等时,这才是正确的。否则,这可能会导致负面和正面的意外。请参阅 IEQuatable
  • 好的,谢谢;这给了我一个想法:只需将另一个列表添加到同一个现有列表中,这样我就不必处理值位于列表开头或结尾的边缘情况。
【解决方案2】:

抱歉回复晚了,我的电脑有问题。您不必添加另一个列表,如果您的列表中至少有 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];
            }

【讨论】:

    猜你喜欢
    • 2013-12-03
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    相关资源
    最近更新 更多