我有一个像这样的分组
var myGroups = dataItems.GroupBy(item => item.ItemType);
如何检查myGroups中是否存在密钥?
答案 0 :(得分:3)
var itemTypeLookup = dataItems.ToLookup(item => item.ItemType);
现在您可以同时执行这两项操作,检查是否存在密钥并在不查询的情况下获取项目:
bool typeExists = itemTypeLookup["sampleType"].Any();
GroupBy
的优势在于您可以根据需要随时访问它,而无需再次执行查询。优于ToDictionary
(在GroupBy
之后)的优点是您可以访问不可用的密钥并获得空序列,而字典索引器会抛出异常。之后你不能改变loookup,你可以将它用于LINQ查询,因为它返回一个序列。除此之外,查找和字典是相似的,并且非常有效。
答案 1 :(得分:2)
通常,您会将该分组转换为Dictionary<TKey, TValue>
。你可以这样做:
var dictionary = dataItems.GroupBy(item => item.ItemType)
.ToDictionary(x => x.Key, x => x.ToList());
如果要检查该词典中是否存在某个键,只需使用:
bool keyExists = dictionary.ContainsKey("someKey");
答案 2 :(得分:1)
var myGroups = dataItems.GroupBy(item => item.ItemType);
var exists = myGroups.Any(x => x.Key == "testName");
你可以使用linq的any方法,它可以节省时间,因为它会在找到匹配后立即停止搜索。
答案 3 :(得分:0)
我认为在这种情况下,您不需要将分组转换为字典,并且搜索将在第一次出现时使用所需的键停止。
bool exist = myGroups.First(x => x.Key == "keyName") != null;
答案 4 :(得分:0)
假设您的意思是要检查一堆密钥
是的,我有一个我期望的清单,然后我想查看它们是否已被退回。
这是检查所有预期组密钥是否存在的一种方法,可能效率不高:
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));