【问题标题】:Getting a value from a ConcurrentDictionary从 ConcurrentDictionary 中获取值
【发布时间】:2012-09-21 19:26:35
【问题描述】:

如果我有这个 ConcurrentDictionary:

public class User
{
    public string Context { get; set; }
    public bool Owner { get; set; }
}

protected static ConcurrentDictionary<User, string> OnlineUsers = new ConcurrentDictionary<User, string>();

如果我已经拥有Context 的值,有谁知道我将如何获得Owner 的值?基本上我想使用Context 进行“查找”。谢谢。

【问题讨论】:

  • 会不会有多个 User 对象具有相同的 Context,如果是,您想获取所有对象吗?
  • 没有。上下文对每个用户都是唯一的。 :)

标签: c# concurrentdictionary


【解决方案1】:

有什么阻止你使用标准的 Linq FirstOrDefault() 方法吗:

var item = OnlineUsers.FirstOrDefault(kvp => kvp.Key.Context == myContext);

【讨论】:

  • 好吧,你在字典上进行线性搜索,这或多或少违背了使用字典的目的(尽管我认为没有重新设计就没有任何选择。
  • 嗯,答案是假设 OP 想要一个 User 对象作为其他目的的键,并且想找出当他只有上下文而不是整个上下文时如何搜索一个值目的。但是,是的,你是对的,如果它可以重新设计,那么它就是正确的做法。
  • 正如问题所述,我认为没有比线性更好的答案了。字典的键是用户,而不是上下文。
【解决方案2】:

怎么样

var ou = OnlineUsers.First(x => x.Key.Context == "TADA");

【讨论】:

    【解决方案3】:

    听起来你需要一个Dictionary&lt;string, User&gt;,当给定上下文作为string 时,它会告诉你它对应于哪个User。如果您需要多次执行此查找,并且使用额外的内存没有问题,那么创建这样一个字典可能是值得的。

    如果您只打算进行一次或两次搜索,或者映射会经常更改以至于您无法使字典保持最新,那么您可以简单地使用foreach 循环,或使用 LINQ 方法,例如 FirstWhere,如其​​他答案所示。

    【讨论】:

      【解决方案4】:

      给你:

      ConcurrentDictionary<User, string> dict = new ConcurrentDictionary<User, string>();
      
      dict.TryAdd(new User() { Context = "a", Ownder = false }, "aa");
      dict.TryAdd(new User() { Context = "b", Ownder = false }, "bb");
      dict.TryAdd(new User() { Context = "c", Ownder = true }, "cc");
      dict.TryAdd(new User() { Context = "d", Ownder = false }, "dd");
      
      IEnumerable<User> list = dict.Keys.Where(p => p.Context == "a");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-31
        相关资源
        最近更新 更多