【问题标题】:Linq get object or new object from Dictionary <object,bool>Linq 从 Dictionary <object,bool> 中获取对象或新对象
【发布时间】:2015-01-16 18:27:07
【问题描述】:

我知道我今天发了一些帖子,但希望你们继续保持出色...

所以我有一个

Dictionary<obj, bool> objDict;

我正在尝试获取单个对象,如果它存在,如果不返回它的新版本...

obj foo = objDict.Keys.SingleOrDefault(x => x.id == t.id).DefaultIfEmpty((new obj() );

这会引发一些错误,主要是围绕转换...

有没有办法从字典中返回单个键,或者在新键不存在的情况下返回默认的新键...

【问题讨论】:

  • 不,没有这样的事情。字典不会自动为您创建新对象。使用TryGetValue(),如果返回false,则自己创建new obj()

标签: c# linq dictionary linq-to-objects default-value


【解决方案1】:

TryGetValue 尝试从一个键中获取一个值,如果该键实际上有一个值。

如果您想在键不存在时向字典添加新值,那么没有 single 方法可以为您完成所有这些工作(ConcurrentDictionary 有一个,命名为GetOrAdd)。要获得 Dictionary 的这种行为,您需要创建自己的方法来调用 TryGetValue 并在返回 false 时添加新的键/值对。

请注意,您不应该对 Dictionary 进行线性搜索来尝试找到与您拥有的密钥相等的密钥。 Dictionary 的整个设计是允许快速查找,而您甚至没有使用。

【讨论】:

  • 正确,我知道我没有按照这里的设计使用它,这是转换的一部分,因为 key/obj 类型之间没有直接转换,一旦 dict 更新/完成,它将是在其他地方使用,因为它是 inteded。
  • @asuppa 你已经有一个Dictionary,并且你正在尝试获取一个键的值。鉴于这种情况,您应该使用索引器或TryGetValue,而不是遍历Keys。如果您实际上还没有Dictionary,那么问题中并没有反映出来。
  • 实际上我正在尝试获取 obj(密钥)来更新密钥中的属性,或者创建一个新的 obj(密钥)并在需要时添加它...
  • @asuppa 在这种情况下,TryGetValue完全适合这项工作的工具。迭代Keys 不是。尝试从字典中获取值,如果可以,更新值,如果不能,添加新的键/值对。这正是您想要的行为,它利用字典的能力比迭代更快地执行查找。
【解决方案2】:

试试这个:

obj yourObject;
objDict.TryGetValue(t.Id, out yourObject) ? yourObject : new obj();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多