在给出包含字典的一堆类的情况下,如何在字典中找到值?

时间:2017-05-21 00:53:06

标签: c# dictionary data-structures

我的课有问题。我需要做点什么,但无法找到解决方案。

每个class1都有一个包含字符串键和class2值的字典。我知道在任何class1中都没有两个字典键匹配。如果给出密钥,我如何在class1的堆栈中找到某个class2?

2 个答案:

答案 0 :(得分:1)

假设这些类:

public class Class1
{
    public Dictionary<string, Class2> ClassTwos { get; private set;}
    public Class1()
    {
        ClassTwos = new Dictionary<string, Class2>();
    }
}

public class Class2 {}

如果您有多个Class1个实例,每个实例都有自己的Dictionary<string,Class2>,那么您无法保证相同的密钥不会出现在多个词典中。您只能确定它不会在同一个词典中出现两次。因此,如果您正在查找某个密钥的Class1集合,则可能会获得多个结果。

假设您只想要第一个结果:

(有很多方法可以使用LINQ,但这更清楚地说明了发生了什么。)

Class2 FindClassTwoByKey(Stack<Class1> stack, string key)
{
    foreach (var class1 in stack)
    {
        if (class1.ClassTwos.ContainsKey(key))
        {
            // We found a match. Return it. We're done.
            return class1.ClassTwos[key];
        }
    }
    return null;
}

或者如果您想要返回所有匹配项:

List<Class2> FindClassTwosByKey(Stack<Class1> stack, string key)
{
    var result = new List<Class2>();
    foreach (var class1 in stack)
    {
        if (class1.ClassTwos.ContainsKey(key))
        {
            result.Add(class1.ClassTwos[key]);
        }
    }
    return result;
}

或者如果你想使用LINQ来做这件事,因为它更难读,但很有趣,

Class2 FindClassTwoByKey(Stack<Class1> stack, string key)
{
    return stack.Where(s => s.ClassTwos.ContainsKey(key))
        .Select(s => s.ClassTwos[key])
        .FirstOrDefault();
}

List<Class2> FindClassTwosByKey(Stack<Class1> stack, string key)
{
    return stack.Where(s => s.ClassTwos.ContainsKey(key))
            .Select(s => s.ClassTwos[key])
            .ToList();
}

答案 1 :(得分:0)

您必须迭代字典的值。

字典O(1)用于查找密钥。但是他们是寻找价值的O(N)。

也许词典不适合您的问题。