2013-06-01 5 views
0

Эта функция всегда возвращает значение null. sString - это класс со строкой «Имя» и строковые значения «Значение». Не спрашивайте, почему я не использую регулярную строку - это сложно. вот моя функция:Функция всегда возвращает null?

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, и он работает, за исключением случаев, когда оператор всегда ложно. Я не могу понять, почему. У меня фактически есть почти идентичный класс, называемый sDecimal, где единственное различие - это свойство Value - это десятичное число, а не строка. Get_sDecimal() отлично работает с этим, и единственное различие между Get_sDecimal() и Get_sString() заключается в том, что каждый тестирует sDecimal и один тест sString. Спасибо!

EDIT: Вот класс 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;      
    } 
} 

EDIT: Вот некоторые выходные коды (и выходные), чтобы очистить вещи.

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 

EDIT: Я добавил еще пару переменных в списке. Вот новый результат:

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

По-прежнему нет соответствия.

+7

Могу ли я спросить, почему вы вместо этого не используете обычный словарь? – Thilo

+1

Когда вы нарушаете код и вручную проверяете VarList, действительно ли он содержит строку, которую вы ищете (помните '==' is case senstive)? –

+0

Да, да. Я сделал чек, где он напечатал как VarName, так и TestsString.Name на экране, и оба были идентичны. Он по-прежнему возвращает null. – cubician

ответ

2

Вы понимаете, что вы в основном повторной реализации LINQ:

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

Кроме того, ваш sString класс может быть просто KeyValuePair<string,string>

UPDATE

На самом деле, вы сказал:

Он должен вернуть экземпляр с тем же значением, как имя VarName

Но это не возвращает sString экземпляра. Вместо этого он возвращает TestsString.Name - это ту же строку, с которой вы начали, но только в том случае, если она находится в списке. Таким образом, в основном это сложная проверка «содержит».

+0

вы не можете использовать * просто * 'FirstOrDefault' здесь; возвращаемое значение должно быть '.Name', а не' sString'. И нет ничего плохого в хорошем честном цикле 'foreach', p –

+0

@MarcGravell - О, ты прав, я так пропустил это! –

+0

@MarcGravell - На самом деле, теперь я вижу, почему я допустил эту ошибку. Прочтите его текст сразу после кода. Я обновлю ... –

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
+0

Да, код работает. Я сам испытал это. Поэтому это должно быть связано с чем-то другим. Может быть, список как-то пуст. –

+2

@Jay мои деньги на пробеле –

+0

Тогда я буду искать пробелы. Я вернусь, если это не так. Благодаря! – cubician

1

Вы должны использовать String.Equals вместо оператора ==.

== Оператор не всегда работает. вы можете найти образцы в потоке Are string.Equals() and == operator really same?.

+1

Поскольку типы известны статически как '==', нет веских оснований для использования здесь 'Equals', и очень хорошая причина не (' == 'избегать проблем с' null') - и посредственная причина не to ('==' избегает ненужной виртуальной отправки). В принципе, если вы знаете типы данных, '==' обычно предпочтительнее в .NET. –

Смежные вопросы