如果我有一个IEnumerable,我如何使用linq拆分它们以在基于Tenant
,UserId
,AccountId
和Bucket
的唯一执行列表中给出列表。
我希望得到的形式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>>
,IGrouping
是IEnumerable<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
Try
var splitMessages = messages
.GroupBy(x => (x.Bucket, x.AccountId, x.Tenant, x.UserId))
.ToDictionary(key => key.Key, values = values.Select(s => s);