【问题标题】:Find object in list with given property value then find dictionary value在具有给定属性值的列表中查找对象,然后查找字典值
【发布时间】:2017-05-05 12:43:11
【问题描述】:

我有一个对象列表。这些对象中的每一个都有一个Name 属性和一个ObservablePairCollection,它只是一个自定义字典,工作方式与字典完全一样,有一个键/值对。

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

示例:给定字符串“model1”作为名称,“纬度”作为键,应该找到一个 name 属性等于 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,但如果不是,也没什么大不了的。

【问题讨论】:

  • 如果我理解正确,你需要这样的东西:models.Single(m =&gt; m.Name == "someName").Fields.Single(f =&gt; f.Key == "Latitude");
  • @Nino 为什么在字典中搜索关键字时使用Single
  • @InBetween,你是对的,First() 是更好的方法。
  • 谢谢@Nino,InBetween 是一种更便宜的方法,但你的方法确实适用于此目的。

标签: c# linq dictionary


【解决方案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);

【讨论】:

  • 嗯,这些对象总会有 6 个实例,每个实例都有一个唯一的名称。因此,一旦我找到了具有正确名称的那个,我就不必使用 single 来查找键/值对。
  • @pfinferno First 是返回搜索对的最便宜的,一旦找到第一个匹配项,它将停止迭代。 WhereSingle 会迭代整个枚举,代价更高。
猜你喜欢
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 2020-10-21
  • 2012-07-13
相关资源
最近更新 更多