C#按以下值对排序列表进行分组

C# Grouping a sorted List by following value

我有一个排序的“列表订单”。 该列表已排序,如下所示:

class Order {
public int Id { get; set; }
public string Name { get; set; }
public string DeliveryPerson { get; set; }
}

它们已经按 Id 排序:

Order12 [DeliveryPerson: Andrea]
Order13 [DeliveryPerson: David]
Order14 [DeliveryPerson: Andrea]
Order15 [DeliveryPerson: Andrea]
Order16 [DeliveryPerson: Linda]
...

现在我想根据以下 ID 按 DeliveryPerson 对它们进行分组: --> 所以 Order12 是一组, 订单13为一组 但是Order 14和15是一组的,因为从Order14的角度来看,Order 15有相同的DeliveryPerson。 (Order16又是一个新组)

我该怎么做?我是否仍需要使用列表或 IEnumerables 或...? 希望有人能帮助我。

你想要连续分组吗?您可以使用以下循环:

List<Order> orders = // your list

List<List<Order>> orderGroups = new List<List<Order>>();
if(orders.Count > 0) orderGroups.Add(new List<Order> { orders[0] });

for (int i = 1; i < orders.Count; i++)
{
    Order currentOrder = orders[i];
    if (orders[i - 1].DeliveryPerson != currentOrder.DeliveryPerson)
        orderGroups.Add(new List<Order> { currentOrder });
    else
        orderGroups.Last().Add(currentOrder);
}

此扩展程序可能对您有所帮助,欢迎光临 ;)

    public static IEnumerable<IGrouping<TKey, TElement>> GroupByFollowingValue<TKey, TElement>(
        this IEnumerable<TElement> elements, Func<TElement, TKey> keySelector)
    {
        IEnumerable<IGrouping<TKey, TElement>> o = null;
        for (int i = 0; i < elements.Count();)
        {
            int s = i;
            var ts = elements.Skip(s).TakeWhile(x => keySelector.Invoke(x).Equals(elements.Select(keySelector).ElementAt(s)));
            i += ts.Count();
            if (o != null) o = o.Concat(ts.GroupBy(keySelector));
            else o = ts.GroupBy(keySelector);
        }
#if DEBUG
        foreach (var t in o)
        {
            Console.WriteLine($"\r\n{t.Key}");
            foreach (var i in t) { Console.Write($"\t{i}"); }
        } 
#endif
        return o;
    }