繁体   English   中英

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 是一组,Order 13 是一组,但 Order 14 和 15 是一组,因为从 Order14 的角度来看,Order 15 具有相同的快递送货员。 (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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM