Linq组by有多个键

  • 本文关键字:by Linq c# linq
  • 更新时间 :
  • 英文 :


如果我有一个IEnumerable,我如何使用linq拆分它们以在基于Tenant,UserId,AccountIdBucket的唯一执行列表中给出列表。

我希望得到的形式IEnumerable<(Tenant,UserId,AccountId,Bucket),IEnumerable<TradeExecuted>>列表的列表。

public class TradeExecuted : INotification
{
public Guid Tenant { get; init; }
public UserId UserId { get; init; }
public string AccountId { get; init; }
public string Bucket { get; init; }
/* other fields */
}

我在下面给出了UserId对象,但是我相信本文通过ValueObject解决了对惟一性的关注。

public class AccountId : ValueObject
{
public string Account { get; init; }
public string Broker { get; init; }
public AccountId(string broker, string account)
{
Broker = broker;
Account = account;
}
protected override IEnumerable<object> GetEqualityComponents()
{
yield return Broker;
yield return Account;
}
}

一本字典是可以的,但如果你的头脑被下面的东西冻结了:

var splitMessages = messages
.GroupBy(x => (x.Bucket, x.AccountId, x.Tenant, x.UserId))
.ToDictionary(key => key.Key);

如果更容易得到列表的列表,我也同意-指针非常感谢。

我不知道为什么你需要做任何超出分组的事情,GroupBy提供了IEnumerable<IGrouping<TKey,TElement>>,IGroupingIEnumerable<out TElement>的扩展,所以你可以看到,只是使用GroupBy()为你提供了一个列表。

这就是为什么我可以这样做。


var splitMessages = messages
.GroupBy(x => (x.Bucket, x.AccountId, x.Tenant, x.UserId));
var castedMessages = (IEnumerable<IEnumerable<TradeExecuted>>)splitMessages;

我不能说我完全理解这种形式是什么IEnumerable<(Tenant,UserId,AccountId,Bucket),IEnumerable<TradeExecuted>>IEnumerable被描述为具有一个协变泛型参数。看起来你想要的正是IEnumerable<…>>Offers,它是一个包含键

的列表的列表

Try

var splitMessages = messages
.GroupBy(x => (x.Bucket, x.AccountId, x.Tenant, x.UserId))
.ToDictionary(key => key.Key, values = values.Select(s => s);

最新更新