【问题标题】:Check if the number is contained within Dictionary array C#检查数字是否包含在字典数组 C# 中
【发布时间】:2017-11-21 09:30:24
【问题描述】:

我有字典,键是一个 int 数组,值是一个字符串。如何通过检查 int 是否包含在键数组中来获取值?

public static Dictionary<int[], string> MyDic = new Dictionary<int[], string>
{
    {new int[]{2,25},"firstValue"},
    {new int[]{3,91,315,322},"secondValue"}
};

我有:

int number=91;
string value=?;

我需要这个值会得到"secondValue"

【问题讨论】:

  • 你能遇到一个键数组包含与不同键数组相同的数字的情况吗? (但并非所有值都相同)?例如,91 可以作为第一个和第二个值的键的一部分吗?
  • 老实说,这似乎不是一个很好的字典用法。感觉它作为一个项目列表会更好,其中每个项目都包含一个整数集合和一个名称。除了其他任何东西,这将允许您以名称的形式表达意图。
  • Gilad Green - 这不可能发生
  • 使用像int[] 这样的引用类型作为字典的键不会像你期望的那样工作,除非你通过重载.Equals 和GetHashCode 来提供等价。比较var x = new [] {1, 2, 3};var y = new [] {1, 2, 3};的HashCodes,你会发现问题在这里。

标签: c# arrays dictionary


【解决方案1】:

我认为这是一个糟糕的设计选择。如果键之间的数字不重复(正如您在问题评论中所说),那么只需将键压平为简单的Dictionary&lt;int,string&gt;。只需将不同的整数都作为相同字符串的键即可。

例如:

Dictionary<int,string>
{
    [2] = "firstValue",
    [25] = "firstValue",
};

为了不重复相同的值但作为不同的对象,您可以在此处放置引用:

string firstValue = "firstValue";
Dictionary<int,string>
{
    [2] = firstValue,
    [25] = firstValue,
};

在这种情况下,为一个键更改值的内容(不是字符串,因为它是不可变的,但如果它是其他对象)将更改所有键。

【讨论】:

    【解决方案2】:

    使用 contains 和 foreach 循环(比其他一些解决方案更具可读性):

    string value;
    int number = 91;
    
    foreach(KeyValuePair<int[], string> entry in MyDic)
    {
        if (entry.Key.Contains(number))
        {
            value = entry.Value;
        }
    }
    

    但是,也许字典不是这个的正确选择。 查看 Gilads 的答案,了解您可以使用的另一种结构

    【讨论】:

    • 虽然您的解决方案有效,但它鼓励滥用字典以达到不应该使用的目的。
    • 同意。如果 OP 出于某种原因与所创建的可怕结构相关联,它就在那里。
    • M 键。我只想添加一些关于原始解决方案问题的注释。 - 但我承认这完全是基于意见的。
    【解决方案3】:
    string value = MyDic.FirstOrDefault(x => x.Key.Contains(number)).Value;
    

    ?不需要,不能申请? KeyValuePair 的操作数

    【讨论】:

    • 在这种情况下,如果您的密钥不在这里,您将 NullReferenceException
    • 不 我把 ?运算符它不会在 VS 中自行编译,导致不可为空的 "KeyValuePair" FirstOrDefault 将自动返回 null
    • @Boo 您的回答中提到的陈述是否已编译?
    • @Boo 你最好把功劳给我我试着编辑答案
    • @Boo Chirag 是正确的。 KeyValuePair is a struct,因此 null 条件运算符不适用于您的答案,因为它适用于引用类型。 KeyValuePair&lt;int[], string&gt; 的默认值为(null, null),因此可以在 FirstOrDefault 之后安全地取消引用该值。返回为空。
    【解决方案4】:

    类似

    value = MyDic.FirstOrDefault(x => x.Key.Contains(number)).Value;
    

    将返回第一次出现或 null

    【讨论】:

    • @GiladGreen: 使用这种形式的字典没有意义,除非 OP 实际上具有对数组的引用并会使用它们执行查找。 (数组不会覆盖 Equals/GetHashCode。)
    • @GiladGreen:但这不应该是对问题的评论而不是答案吗? OP 选择了一个不幸的数据结构并不是 Boo 的错。
    • 好吧,我假设他的数据结构不能改变,就像它来自外部库一样,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2022-06-30
    • 2015-02-07
    • 1970-01-01
    • 2013-08-16
    • 2021-01-03
    • 2012-09-14
    相关资源
    最近更新 更多