按值属性获取字典中的值子集

时间:2013-01-26 15:37:50

标签: c# .net linq generics dictionary

原始问题:

我有一本词典。我怎样才能获得

所在的子集集合

例如:object.Age == 30object.gender == "male"等。

问题改写为更为通用且对其他用户有帮助:

在字典中,键是一个简单类型,如string或int,但我的值是对象,如何按属性搜索值并返回值的子集?

即一般情况下我可以说

Dictionary<string, myObject> dict = new Dictionary<string, myObject>();

我想搜索myObject.someInt == X和myObject.someString ='XYZ',我该怎么做?

4 个答案:

答案 0 :(得分:3)

您可以使用Dictionary.ValuesEnumerable.Where

var age30OrMale = dict.Values.Where(o => Age == 30 || o.gender == "male");
foreach(var o in age30OrMale)
{
    // ...
}

如果您想要新的收藏品,可以使用ToListToArray

var list = age30OrMale.ToList();

请注意,这不是字典本身的子集,因此它不是IEnumerable<KeyValuePair<TKey,TValue>>。但这就是你要求的。

答案 1 :(得分:3)

最简单的方法是使用lambda:

var newDictionary = myDictionary.Values.Where(d => d.Age == 30);

编辑:

根据您修改后的问题:

var newDictionary = myDictionary.Values.Where(d => d.Age == 30 || d.Gender == "male");

我不确定“等”是什么意思,但您可以使用||和/或&&

继续构建它

编辑:

正如@Guffa正确指出的那样,结果值不是字典:

var newSubset = myDictionary.Values.Where(d => d.Age == 30 || d.Gender == "male");

答案 2 :(得分:2)

var newDictionary = myDictionary.Values.Where(d => d.Age == 30 || d.gender == "male").ToDictionary();

答案 3 :(得分:1)

您只需遍历值并获取这些项目:

List<MyObject> result = myDictionary.Values.Where(o => Age == 30).ToList();