[英]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.