如何查询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() != "")
以上内容不起作用。
您似乎误解了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>
。