检查GroupBy Key是否存在

时间:2017-11-24 14:36:44

标签: c# ienumerable

我有一个像这样的分组

var myGroups = dataItems.GroupBy(item => item.ItemType);

如何检查myGroups中是否存在密钥?

5 个答案:

答案 0 :(得分:3)

我使用Lookup<TKey, TElement>

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));
相关问题