Linq group by 多个键

Linq group by with multiple keys

如果我有一个 IEnumerable,我如何使用 linq 拆分它们以在基于 TenantUserIdAccountIdAccountId 的唯一执行列表中给出一个列表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 per this article.

可以解决唯一性问题
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);

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

尝试

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

我不确定为什么您需要做分组以外的任何事情,GroupBy 提供了一个 IEnumerable<IGrouping<TKey,TElement>>,其中 IGroupingextension 的 [=14] =] 正如您所见,仅使用 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> 提供的,这是一个列表列表,其中包含键