2015-07-20 5 views
1

Позвольте мне сказать, что я прочитал свою проблему, в частности this question и this one also. Однако моя проблема немного другая. Я понимаю различия между различными методами, но не могу заставить мой код правильно работать для меня.Неполадки с сопоставлением строк

В части моего кода у меня есть сравнение ниже. Но сравнение всегда терпит неудачу, и распечатывается «Тип: нога».

if (String.Compare(timer.Type,"leg",true) == 0) 
{ 
    timer.StopTime = DateTime.Now; 
    // TODO Log into database here 
    toRemove.Add(timer); 
} 
//Couple more conditions in here... 
else 
{ 
    Console.WriteLine("Attempting to remove cycle timer of invalid type"); 
    Console.WriteLine("Type is:" + timer.Type); 
//TODO: Log error 
} 

Я также пробовал альтернативные методы, но никто из них, похоже, не работает для меня.

if(timer.Type == "leg" || timer.Type == "Leg") //Fails 

if(time.Type.Equals("leg") || timer.Type == "Leg") //Fails 

String type = timer.Typer; //Worth a shot... 
if(type == "leg" || type == "Leg") //No luck 

EDIT: запрошено больше кода, так что вот весь метод.

private void stopFinishedTimers(AGVData agv) 
{ 
    List<CycleTimer> toRemove = new List<CycleTimer>(); 

    foreach (CycleTimer timer in AllRunningCycleTimers) 
    { 
     if (agv.CurrentRFIDNumber == timer.CycleStopRfid) 
     { 
      if (String.Compare(timer.Type,"leg",true) == 0) 
      { 
       timer.StopTime = DateTime.Now; 
       // TODO Log into database here 
       toRemove.Add(timer); 
       } 
      else if (timer.Type.Equals("route") || timer.Type.Equals("Route")) 
      { 
       timer.StopTime = DateTime.Now; 
       // TODO Log into database here 
       toRemove.Add(timer); 
      } 
      else 
      { 
       Console.WriteLine("Attempting to remove cycle timer of invalid type"); 
       Console.WriteLine("Type is:" + timer.Type); 
       //TODO: Log error 
      } 
     } 
    } 

Где CycleTimers - класс, содержащий поля типа типа, доступ к которым осуществляется через свойство.

+1

Откуда взялся CycleTimer? это один из ваших собственных классов? Используете ли вы какую-то специальную структуру? – Bongo

+1

@JShell Спасибо за ваше обновление. Тем не менее, определение 'CycleTimer' отсутствует. – BartoszKP

+0

@JohnCarpenter 'StringComparison.Ordinal' исправил это, спасибо миллиону – JShell

ответ

2

я добавлю свои два цента:

Линия String type = timer.Typer кажется неправильным, потому что имя свойства Type в большинство ваших примеров. Также if(time.Type.Equals("leg") || timer.Type == "Leg") кажется подозрительным, поскольку вы ссылаетесь на time и timer вместо той же переменной оба раза.

Наконец, я всегдавсегда использование StringComparison.Ordinal при сравнении строк в .NET, из-за культуры информации и набора символов различия, и т.д. Я не уверен, если это может быть проблемой, но увидеть this для получения дополнительной информации.

EDIT:

На стороне записки, StringComparison.OrdinalIgnoreCase также вариант.

1

Отладить и поставить оператор break, чтобы узнать, какой тип timer.Type соответствует или помещает Console.WriteLine (timer.Type.ToString()) ... Может ли таймер выйти из сферы действия?

или, возможно, изменить тест на timer.Type.ToString() == «Нога»

+0

== Не работает так, что строки, метод Equals() всегда лучше. – L3n

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