使用给定的属性值在列表中查找对象,然后查找字典值

时间:2017-05-05 12:43:11

标签: c# linq dictionary

我有一个对象列表。这些对象中的每一个都具有Name属性,而ObservablePairCollection只是一个像字典一样完全正常工作的自定义字典,具有键/值对。

给定两个字符串,一个用于名称,一个用于键,我想找到首先匹配给定名称的对象,然后从该模型的字典中选择与给定键值匹配的pair

示例:给定名称的字符串“model1”和键的“Latitude”,应该找到名称属性等于model1的对象,然后对象的字典中的键/值对应该是在密钥等于Latitude的情况下返回。

目前我可以使用以下代码来完成与Name匹配的第一部分:

private ObservableCollection<ModelBase> models;
//add objects to models

string stringToFind = "model1";

models.Single(m => m.Name == stringToFind);

因此,这会返回Name属性等于model1的对象。

我无法找到用于获取键/值对的正确语句。

以下是该课程的相关部分:

private ObservablePairCollection<string, string> _fields = new ObservablePairCollection<string, string>();
public ObservablePairCollection<string, string> Fields
{
    get { return _fields; }
    set { _fields = value; OnPropertyChanged("Fields"); }
}

private string _name;
public string Name
{
    get { return _name; }
    protected set
    {
        if (_name != value)
        {
            _name = value;
            OnPropertyChanged("Name");
        }
    }
}

如果可能的话,我想使用LINQ,但如果不是,那就不是很大。

1 个答案:

答案 0 :(得分:1)

首先,为什么Single?必须只有一个具有给定Name的对象,并且您必须在此特定代码中强制执行吗?请记住Single是昂贵的,因为它会枚举整个集合以确保找到的对象是唯一的。

如果您只是想找到第一个(如果有的话),那么只需使用恰当命名的First扩展方法:

models.First(m => m.Name == stringToFind);

好的,所以返回第一个具有给定Name的对象,如果有的话,你只需要过滤Fields proyerty:

var pair = models.First(m => m.Name == stringToFind)
                ?.Fields
                 .First(f => f.Key = keyToFind);