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;
}
我有一个排序的“列表订单”。 该列表已排序,如下所示:
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;
}