函数总是返回null?

时间:2013-06-01 04:26:49

标签: c# class function foreach null

此函数始终返回null。 sString是一个带有字符串“Name”和字符串“Value”值的类。不要问我为什么不使用常规字符串 - 这很复杂。这是我的功能:

static string Get_sString(string VarName, ref List<sString> VarList)
{
    foreach (sString TestsString in VarList)
    {
        if (TestsString.Name == VarName)
        {
            return TestsString.Name;
        }
    }
    return null;
}

它应该返回与VarName具有相同Name值的实例,除了if语句始终为false 之外,它都可以工作。我无法弄清楚为什么。我实际上有一个几乎相同的类,叫做sDecimal,唯一的区别是Value属性是十进制,而不是字符串。 Get_sDecimal()与此完美匹配,Get_sDecimal()和Get_sString()之间的唯一区别是测试sDecimal和测试sString。 的谢谢!

编辑: 这是sString类。

class sString
{
    public string Name;
    public string Value;

    /// <summary>
    /// String Value variables that may have the same name.
    /// </summary>
    /// <param name="n">Internal name of variable.</param>
    /// <param name="v">Value of variable.</param>
    public sString(string n, string v)
    {
        Name = n;                    
        Value = v;                    
    }
}

编辑:这里有一些输出代码(和输出)来清理。

static string Get_sString(string VarName, ref List<sString> VarList)
        {
            foreach (sString TestsString in VarList)
            {
                Console.WriteLine("Looking for: " + VarName);
                Console.WriteLine("Comparing with: " + TestsString.Name);
                if (TestsString.Name == VarName)
                {
                    Console.WriteLine("Match!");
                    return TestsString.Name;
                }
            }
            return null;
        }

这是输出:

Looking for: Q
Comparing with: Q

编辑:我在列表中添加了几个变量。这是新的输出:

Looking for: Q
Comparing with: Q
Looking for: Q
Comparing with: Z
Looking for: Q
Comparing with: VariableX

仍然没有匹配。

3 个答案:

答案 0 :(得分:6)

代码从根本上起作用:

var list = new List<sString>
{
    new sString("foo", "123"),
    new sString("bar", "456")
};
var s = Get_sString("foo", ref list);
// = "foo", not null

不要误会我的意思 - 我会改变它的每一行。但它并不总是返回null

简要问题清单:

  • 公共字段
  • 不必要ref
  • 可以使用Dictionary<string,string>
  • 可怕的名字
  • 我想知道你是否应该回归.Value而不是.Name

答案 1 :(得分:2)

你确实意识到你已经基本上重新实现了LINQ:

return VarList.FirstOrDefault(x=> x.Name == VarName);

此外,您的sString课程可能只是KeyValuePair<string,string>

<强>更新

实际上,你

  

它应该返回具有与VarName相同的Name值的实例

但它不会返回sString个实例。相反,它会返回TestsString.Name - 这与您开始时的字符串相同,但前提是它在列表中。所以基本上,这是一个复杂的“包含”检查。

答案 2 :(得分:1)

您应该使用String.Equals而不是== operator。

==运算符并不总是有效。 你可以在帖子Are string.Equals() and == operator really same?中找到样本。