[英]How do I convert a list of lists to dictionary in C#?
我有一个盒子列表(唯一,带有ID),每个盒子里都有某些物品(唯一,带有ID)。 例:
list<box> boxes = new list<boxes>;
哪里,
class box
{ ...
list<item> items = new list<item>;
...
}
给定商品ID,我需要找到商品详细信息。 为此,我目前正在做这样的事情:
foreach (box b in boxes)
{
foreach (item i in b.items)
{
if (i.id == searchId)
return i;
}
}
问题是:如何将该列表数据结构转换为字典数据结构?
因为我有键(Id),所以我认为使用字典会是更好的选择?
如果相同的项目可能存在于多个框中,则可以选择所有项目,然后按ID进行分组,然后从每个组中选择第一个项目作为字典的值:
Dictionary<int, item> items = boxes.SelectMany(b => b.items)
.GroupBy(i => i.id)
.ToDictionary(g => g.Key, g.First());
如果所有项目都有唯一的ID:
var items = boxes.SelectMany(b => b.items) .
.ToDictionary(i => i.id);
获取项目如下所示:
if (items.ContainsKey(searchId))
return items[searchId];
如@Douglas所述,为避免重复查找,最好使用TryGetValue方法:
item i;
if (items.TryGetValue(searchId, out i))
return i;
注意:不带字典的Linq替代品将是(它与您的代码完全相同-每次搜索都列举方框及其项目):
var item = boxes.SelectMany(b => b.items).FirstOrDefault(i => i.id == searchId);
因此,如果您不想在每次搜索之间都包含字典,或者如果您需要执行单个搜索,那么可以使用此解决方案。
假设您的所有商品都是唯一的:
var dictionary = boxes.SelectMany(box => box.items).ToDictionary(item => item.id);
然后,您可以使用以下方法查找值:
item i;
if (dictionary.TryGetValue(searchID, out i))
return i;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.