[英]LINQ GroupBy return List as result
我有一个包含Transaction对象的List。 我要做的是找到所述List中具有相同transaction.Buyer.UserID的事务,并将它们组合成一个列表列表。
每个Sub-List项将包含多个事务对象,其中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()
并在原始列表上执行删除操作。希望有帮助。
尝试这个 :
var dic = _transactions.GroupBy(t => t.Buyer.UserID).ToDictionary(t => t.Key, t => t.ToList());
GroupBy返回一个
IEnumerable<IGrouping<TKey, TSource>>
每个IGrouping <>包含Key,组标准,每个IGrouping都是可枚举的(列出分组值)
因为,问题改变了:
不要在GroupBy委托中创建匿名类型(没有新的{...})而是直接定位属性(因为在内部,GroupBy使用相等来分组事物,并且因为你创建了一个新的匿名对象,所以没有任何分组,因为每个新对象是不同的对象)
.GroupBy(o => o.Buyer.UserID, o.ToList)
此外,
Select(p => p)
什么都不做,这是一个身份功能。 没用的。
如果您想要的是列表列表,我认为您可以直接使用词典。 (请参阅我的答案的第一部分)您可以按照枚举List的相同方式枚举字典。 并在其中添加/删除/替换项目。
返回的Dictionary将是以下类型:
Dictionary<int,List<Transactions>> dic =....
使用Key = UserId,以及每个键,一个事务列表。 而且,它实际上比列表列表更快,因为您可以直接访问事务:
int userId = 42;
List<Transactions> transactions = dic[userId];
在LINQ分组 。
这可以回答您的查询。
var results = transactions.GroupBy(p => p.Buyer.UserID,
(key, g) => new { UserID = key, Cars = g.ToList() });
如果我理解正确,
您有一个事务列表和一个列表的事务列表。
您需要通过userId对后者进行分组,其中值将是与该用户对应的事务。
如果是这样的话,我准备了一个可能有用的小样本。
祝好运
public class Transaction
{
public Buyer Buyer { get; set; }
}
public class Buyer
{
public int UserID { get; set; }
}
[TestMethod]
public void Test()
{
var t1 = new Transaction { Buyer = new Buyer { UserID = 1 } };
var t2 = new Transaction { Buyer = new Buyer { UserID = 2 } };
var t3 = new Transaction { Buyer = new Buyer { UserID = 3 } };
var t4 = new Transaction { Buyer = new Buyer { UserID = 1 } };
var t5 = new Transaction { Buyer = new Buyer { UserID = 3 } };
var tList1 = new List<Transaction> { t1, t2, t3 };
var tList2 = new List<Transaction> { t4, t5 };
var tLists = new List<List<Transaction>> { tList1 , tList2};
var result = tLists.
SelectMany(o => o).
GroupBy(o => new
{
UserId = o.Buyer.UserID
},
(key, items) => new
{
UserId = key.UserId,
Transactions = items.Select(p => p).ToList()
}).
ToList();
}
这是作者编辑的更新解决方案:
var transactions = new List<Transaction>
{
new Transaction { Buyer = new Buyer { UserID = 1 } },
new Transaction { Buyer = new Buyer { UserID = 2 } },
new Transaction { Buyer = new Buyer { UserID = 3 } },
new Transaction { Buyer = new Buyer { UserID = 1 } },
new Transaction { Buyer = new Buyer { UserID = 3 } }
};
var result = transactions.
Select(o => o).
GroupBy(o => new
{
UserId = o.Buyer.UserID
},
(key, items) => new
{
//UserId = key.UserId,
Transactions = items.Select(p => p).ToList()
}).
ToList();
不,你得到一个IEnumerable<IGrouping<TKey, TSource>>
参见: MSDN Group By
所以基本上它返回一个组列表。 该组包含分组的键和元素,该元素是属于该组的项目列表
名单
很好的解释: https : //www.udemy.com/blog/linq-group-by/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.