我有一个包含事务对象的列表。我想要做的是在上述列表中找到具有相同 transaction.Buyer.UserID 的交易,并将它们组合到一个列表列表中。
每个子列表项目将包含多个交易对象,其中 transaction.Buyer.UserID 相同。
我目前拥有的是:
var _ordersToCombine =
_transactions.GroupBy(transaction => transaction.Buyer.UserID).Select(transaction => transaction);
我进来的是什么:
List<Transaction>:
Transaction { Buyer.UserID = "User1" ...}
Transaction { Buyer.UserID = "User2" ...}
Transaction { Buyer.UserID = "User1" ...}
Transaction { Buyer.UserID = "User3" ...}
Transaction { Buyer.UserID = "User4" ...}
Transaction { Buyer.UserID = "User3" ...}
我期望它返回的是:
List<List<Transaction>>:
List<Transaction>:
Transaction { Buyer.UserID = "User1" ...}
Transaction { Buyer.UserID = "User1" ...}
List<Transaction>:
Transaction { Buyer.UserID = "User3" ...}
Transaction { Buyer.UserID = "User3" ...}
...并从主列表中删除这些事务,因此在本示例中,主列表将如下所示:
List<Transaction>:
Transaction { Buyer.UserID = "User2" ...}
Transaction { Buyer.UserID = "User4" ...}
Linq 对我来说是一个新概念,我正在努力理解。
最佳答案
只需使用它进行分组:
var results = transactions
.GroupBy(p => p.Buyer.UserID)
.Where(x=>x.Count()>1)
.Select(x=> new List<Transaction>(x));
这应该会产生您的 List<List<Transaction>
与主列表中的重复用户。
LINQ 并不是在遍历集合时修改集合的真正正确工具。如果您确实需要它,请执行以下操作:
var results = transactions.ToList()
.GroupBy(p => p.Buyer.UserID)
.Where(x=>x.Count()>1)
.Select(x=>
{
foreach(var item in x)
transactions.Remove(item);
return new List<Transaction>(x);
});
请注意,创建了事务列表的副本以执行查询( transactions.ToList()
并在原始列表上进行删除操作。希望对您有所帮助。
关于c# - LINQ GroupBy 返回列表作为结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28212262/