C# 检查GroupBy键是否存在
我有一个这样的分组C# 检查GroupBy键是否存在,c#,ienumerable,C#,Ienumerable,我有一个这样的分组 var myGroups = dataItems.GroupBy(item => item.ItemType); 如何检查myGroups中是否存在密钥?通常,您会将该分组转换为字典。您可以这样做: var dictionary = dataItems.GroupBy(item => item.ItemType) .ToDictionary(x => x.Key, x => x.ToList()); 如果要检查该词典中是否存在密钥,只需使用
var myGroups = dataItems.GroupBy(item => item.ItemType);
如何检查myGroups中是否存在密钥?通常,您会将该分组转换为
字典。您可以这样做:
var dictionary = dataItems.GroupBy(item => item.ItemType)
.ToDictionary(x => x.Key, x => x.ToList());
如果要检查该词典中是否存在密钥,只需使用:
bool keyExists = dictionary.ContainsKey("someKey");
您可以使用linq的Any
方法,它可以节省时间,因为它会在找到匹配项后立即停止搜索。我认为在这种情况下,您不需要将分组转换为字典,搜索将在第一次出现所需键的项时停止
bool exist = myGroups.First(x => x.Key == "keyName") != null;
假设你的意思是你想检查一串钥匙
是的,我有一份我期待的清单,然后我想看看它们是否已经被归还
这里有一种方法可以检查是否存在所有预期的组密钥,可以说效率不高:
var dataToBeGrouped = new []{4,4,1,2,1,2,1};
var grp = dataToBeGrouped.GroupBy(z => z);
var allKeysPresent = grp.Select(g => g.Key)
.OrderBy(k => k)
.SequenceEqual(new[]{1,2,4});
其中,new[]{1,2,4}
是一组有序的预期键
作为顺序检查的替代方法,您可以创建一组实际密钥,然后确保所有密钥都存在:
var keysToCheck = new HashSet<int>(grp.Select(g => g.Key));
var allKeysPresent = new[]{1,2,4}.All(k => keysToCheck.Contains(k));
var keystecheck=newhashset(grp.Select(g=>g.Key));
var allKeysPresent=new[]{1,2,4}.All(k=>keystecheck.Contains(k));
我会使用:
现在您可以同时执行这两项操作,检查密钥是否存在,并在不再次查询的情况下获取项目:
bool typeExists = itemTypeLookup["sampleType"].Any();
与GroupBy
相比,GroupBy的优点是您可以随时访问它,而无需再次执行查询。与ToDictionary
(在GroupBy
之后)相比,它的优势在于,您可以访问不可用的键,并获得一个空序列,而字典索引器会抛出一个异常。之后不能对loookup进行变异,可以将其用于LINQ查询,因为它返回一个序列。除此之外,查找和字典是相似的,都非常有效。GroupBy
只返回确实存在的键。那么你的问题是什么?您是否有一个您希望存在的密钥列表?是的,我有一个我希望存在的密钥列表,然后我想查看它们是否已返回。虽然这是正确的,但如果OP希望检查2个密钥,则整个查询必须再次运行。另外,请阅读,因为本网站不鼓励只使用代码的答案。使用复合lambda条件,多个键足够简单吗?很好!我不记得以前用过Lookup
var itemTypeLookup = dataItems.ToLookup(item => item.ItemType);
bool typeExists = itemTypeLookup["sampleType"].Any();