Linq group by 多个键
Linq group by with multiple keys
如果我有一个 IEnumerable,我如何使用 linq 拆分它们以在基于 Tenant
、UserId
、AccountId
和 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
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>>
,其中 IGrouping
是 extension 的 [=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> 提供的,这是一个列表列表,其中包含键
如果我有一个 IEnumerable,我如何使用 linq 拆分它们以在基于 Tenant
、UserId
、AccountId
和 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
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>>
,其中 IGrouping
是 extension 的 [=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