gpt4 book ai didi

c# - 订购列表但仍然能够访问索引和字段

转载 作者:行者123 更新时间:2023-11-30 22:24:51 25 4
gpt4 key购买 nike

我正在尝试按特定字段对对象列表进行分组。

稍后,我需要按如下方式使用此列表:

for(i=0; i< list.Count; i++)
{
if(i == 0)
continue;

if (list[i].property != list[i-1].property)
dosomething;
}

我需要做一个 for 循环,这样我就可以说“如果这个项目之前的属性不同......

当我尝试对列表进行排序时,问题就来了。如果我执行 list.GroupBy,我将无法访问列表项的成员。如果我执行 list.OrderBy,我必须将它设置为一个 ienumerable,因此不能使用 for 循环,因为 ienumerables 不适用于列表索引。

有没有办法在 foreach 循环中实现这个功能(不引用索引)?如果没有,是否有另一种方式来订购我的列表,不需要将它设置为 ienumerable?

最佳答案

四个选项:

  • 使用OrderBy然后 ToList得到一个排序列表。然后您可以使用现有代码,但我建议从 1 开始循环而不是从 0 开始并在第一次迭代中立即中断。
  • 使用 OrderBy然后 Zip :

    var ordered = input.OrderBy(...);
    var zipped = ordered.Zip(ordered.Skip(1),
    (Previous, Current) => new { Previous, Current });

    foreach (var pair in zipped)
    {
    if (pair.Previous.Property == pair.Current.Property)
    {
    ... Whatever you want to do
    }
    }

    请注意,不幸的是,这将对输入进行两次排序。没有避免这种情况的内置方法(无需调用 ToList 或其他)。诚然,编写“自压缩”扩展方法并不太难。

  • 使用 OrderBy并保留“以前的属性(property)”:

    var ordered = input.OrderBy(...);
    // This is like using foreach, but with a simple way to get the
    // first item
    using (var iterator = ordered.GetEnumerator())
    {
    if (!iterator.MoveNext())
    {
    return; // Or whatever. No items!
    }
    var previousProperty = iterator.Current.Property;
    while (iterator.MoveNext())
    {
    var currentProperty = iterator.Current.Property;
    if (previousProperty == currentProperty)
    {
    ... Whatever you want to do
    }
    previousProperty = currentProperty;
    }
    }
  • 使用 List<T>.Sort 就地对列表进行排序(如果这不会弄乱其他任何东西)

关于c# - 订购列表但仍然能够访问索引和字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12537470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com