Как определить, изменилось ли значение строковой переменной в C #? - PullRequest
3 голосов
/ 08 апреля 2011

У меня есть кое-что сделать при нажатии кнопки (добавить значения в список), только если конкретная строка отличается от своего предыдущего значения. Как мне это сделать? Ниже приведен пример моего кода:

    private void button6_Click(object sender, EventArgs e)
    {
        string x = //some varying value I get from other parts of my program
        listBox1.Items.Clear();
        listBox1.Items.Add(x + /*other things*/);   
    }

Иногда я могу иметь такое же значение для string x от предыдущего значения при нажатии кнопки6. В таких случаях я не хочу, чтобы listBox1 добавил элемент (строка x). Как добавить в список только при изменении значения строки? Нет способа предопределить string x. Он получает значение при запуске программы.

Примечание: добавление значений в listBox1 каждый раз и последующее удаление дубликатов не будет работать в моей программе.

Ответы [ 7 ]

6 голосов
/ 08 апреля 2011

Рассматривали ли вы сохранение копии строкового значения old в закрытом поле и просто сравниваете новое значение со старым значением, чтобы увидеть, совпадают ли они?

Например,:

// holds a copy of the previous value for comparison purposes
private string oldString = string.Empty; 

private void button6_Click(object sender, EventArgs e)
{
    // Get the new string value
    string newString = //some varying value I get from other parts of my program

    // Compare the old string to the new one
    if (oldString != newString)
    {
        // The string values are different, so update the ListBox
        listBox1.Items.Clear();
        listBox1.Items.Add(x + /*other things*/);   
    }

    // Save the new value back into the temporary variable
    oldString = newString;
}

Редактировать: Как показывают другие ответы, есть, конечно, другие, более сложные решения, такие как инкапсуляция всего доступа к строковому значению в свойстве или перенос строки впользовательский класс.Некоторые из этих альтернатив могут быть более «чистыми», более объектно-ориентированными.Но все они сложнее, чем просто сохранить предыдущее значение в поле.Вам решать, подходит ли ваш конкретный вариант использования сложному решению или более простому.Подумайте о долгосрочной ремонтопригодности, а не о том, что вам проще реализовать прямо сейчас.

3 голосов
/ 08 апреля 2011

Если эта строка очень важна и ее много раздают, возможно, вам следует обернуть ее в классе.Класс может содержать строковое значение как свойство, но также и отслеживать, когда оно изменилось.

public class StringValue
{
   private bool _changed;
   public string StrValue{get; set{ _changed = true;}
   public bool Changed{get;set;}
}

это, конечно, рудиментерия

3 голосов
/ 08 апреля 2011
string last = string.Empty;
private void button6_Click(object sender, EventArgs e)
    {
        string x = //some varying value I get from other parts of my program
        if(x!=last)
        {
            listBox1.Items.Clear();
            listBox1.Items.Add(x + /*other things*/);
            last = x;
        }
    }
1 голос
/ 11 февраля 2014

На странице загрузки добавьте текущее значение в viewstate и при нажатии кнопки проверьте, что текущее значение равно значению в состоянии просмотра. Если оба равны, мы можем сказать, что значение не изменилось.

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
    ViewState["CurrentValue"] = Your Value;
}
}
protected void btnSubmit_click(object sender, EventArgs e)
{
if (NewValue==  ViewState["CurrentValue"].ToString())
{
    lblmsg.Text = "value is not changed..";
return;
}
else
    lblmsg.Text = "value is changed..";
}

Подробную статью вы можете посмотреть по этой ссылке.

Проверьте, изменено или нет контрольное значение

1 голос
/ 08 апреля 2011

Если это веб-приложение, сохраните последнее значение в переменной сеанса.Если это приложение Windows, сохраните его в переменной уровня класса или в одноэлементном классе и используйте это последнее значение для сравнения с новым значением.

1 голос
/ 08 апреля 2011

Я не уверен, что полностью понимаю, но, похоже, вы должны использовать свойство для установки String x;

string _x = string.Empty;
public string X
{
   set
   {
      if(value != this._x)
      {
         DoFancyListBoxWork();
         this._x = value;
      }
   }

   get
   {
      return this._x;
   }
}
0 голосов
/ 08 апреля 2011

Во-первых, я хотел бы попросить вас проверить большинство других ответов. Они более полны, поскольку они занимаются более глобальными проблемами отслеживания изменений переменной.

Теперь я предполагаю, что после прочтения предоставленного вами фрагмента кода вам необходимо отследить, изменилась ли строка пользователем. Итак, другими словами, вы, вероятно, имеете TextBox или другой вид контроля, с помощью которого пользователь может изменить это значение. На этом вы должны сосредоточить свое внимание: просто используйте событие TextChanged.

Если, однако, я ошибаюсь и ваша строка поступает из любого другого внешнего источника, либо используйте класс-оболочку, предложенный @Ryan Bennett, либо, если вы используете .Net 4, используйте динамический контейнер, который вызывает событие PropertyChanged всякий раз, когда изменяется любое свойство.

...