如何查询C#字典并返回一组特定的值

本文关键字:一组 何查询 查询 字典 返回 | 更新日期: 2023-09-27 18:25:16

我的C#程序中有一个字典,其中包含Key+Values列表。

值为itemid, Month, Year, Count

我想通过比较一组值(itemid, Month, Year)来查询字典,如果存在特定的itemid + Month + Year,则返回true或false。

因此,如果所有3个值(itemid + Month + Year)都存在,则返回true,否则返回false。

我试过这种

(if (myd.Select(d => d.Value.itemid == item.itemid && d.Value.Month == DateRange.Month  && d.Value.Year == DateRange.Year).ToString() != "")

以上内容不起作用。

如何查询C#字典并返回一组特定的值

您似乎误解了Select()方法的用法。选择创建一个"投影";给定一个元素的输入集合(enumerable),它生成一个基数相等的输出enumerable,但它由每个元素组成,这些元素都是输入的相应元素转换的结果。

您需要的是Where()方法(返回布尔条件为true的输入中元素的列表,其基数小于或等于输入),或Any()方法,如果输入中的任何元素满足条件,则返回单个"true"或"false"):

if(myd.Where(d => d.Value.itemid == item.itemid 
                && d.Value.Month == DateRange.Month 
                && d.Value.Year == DateRange.Year).Count() >= 1)
   ...
//produces the equivalent result but generally performs faster
if(myd.Any(d => d.Value.itemid == item.itemid 
                && d.Value.Month == DateRange.Month 
                && d.Value.Year == DateRange.Year))
   ...

如果像linq语法一样,这会检查是否存在至少一个满足所有三个条件的项:

if((from d in myd
where d.Value.itemid == item.itemid
&& d.Value.Month == DateRange.Month
&& d.Value.Year == DateRange.Year).FirstOrDefault() != null)

如果您想用另一个关键字(在本例中为itemid、month、year,可能放在一个元组中)进行查找,则需要创建第二个字典,并且无论何时添加/删除这两个关键字,都需要维护这两个字典。

使用Where进行筛选(我假设您代码中的条件定义正确……您没有给我们足够的信息来评估)

var filteredDictionary = myd.Where(d => d.Value.itemid == item.itemid && d.Value.Month == DateRange.Month  && d.Value.Year == DateRange.Year)

使用Select从KeyValuePair转换为仅值

var filteredValues = filteredDictionary.Select(x=>x.Value)

使用Any返回一个项目是否存在的bool

bool matchExists = myd.Any(d => d.Value.itemid == item.itemid && d.Value.Month == DateRange.Month  && d.Value.Year == DateRange.Year)

Any对于您描述的问题将是最有效的,因为它将停止评估字典中的项目,并在找到匹配项时立即返回True

如果使用.NET 4.0,可以使用元组作为键。

var dict = new Dictionary<Tuple<int,int,int>,MyValueType>();

然后,您可以测试是否存在值

var key = new Tuple<int,int,int>(item.itemid, DateRange.Month, DateRange.Year);
if(dict.ContainsKey(key)) {
   ...
}

或者你可以测试

if(dict.ContainsValue(referenceValue)) {
    ...
}

您必须向它传递一个包含您要查找的内容的引用值。确保您的值类型实现EqualityComparer<T>

第一种方法会快得多,因为字典是通过键访问的。如果你不是按键访问字典,你也可以使用List<T>