вопрос цикла foreach - PullRequest
       5

вопрос цикла foreach

1 голос
/ 02 марта 2011

Есть ли другой более короткий / более эффективный способ проверить и проверить, является ли это последним элементом в моем ListBox?Основная цель здесь - в основном добавить выбранные элементы на ярлык и добавить запятую после каждого, кроме последнего.Есть предложения?

        int sc = 0;
        List<string> interestitems = new List<string>();

        foreach (ListItem siitem in ListBox1.Items)
        {
            if (siitem.Selected == true)
            {
               interestitems.Add(siitem.Value.ToString());
            }
        }

        foreach (string inteitem in interestitems)
        {
            Label1.Text += inteitem;
            sc++;
            if (sc < interestitems.Count)
            {
                Label1.Text += ",";
            }
        }

Ответы [ 5 ]

11 голосов
/ 02 марта 2011

Вместо вашего второго цикла просто используйте:

Label1.Text = string.Join("," , interestitems);

приписка

если вы используете .net 3.5, вам нужно передать массив строк в string.Join(), тогда:

Label1.Text = string.Join("," , interestitems.ToArray());

EDIT:

Если вы хотите полностью избежать зацикливания, просто сделайте:

var selItems = ListBox1.Items.Cast<ListItem>()
                       .Where(item => item.Selected)
                       .Select(item => item.ToString());

Label1.Text = string.Join("," , selItems);
2 голосов
/ 02 марта 2011

Как насчет LINQ:

Label1.Text = string.Join(
    ",", 
    ListBox1.Items
            .OfType<ListItem>()
            .Where(item => item.Selected)
            .Select(x => x.Value.ToString())
            .ToArray()
);
0 голосов
/ 02 марта 2011

Почему бы просто не создать строку во время итерации во время первого цикла

var builder = new StringBuilder();
var first = true;
foreach (var item in ListBox1.Items) {
  if (item.Selected) {
    if (!first) {
      builder.Append(", ");
    }
    first = false;
    builder.Append(item.Value.ToString());
  }
}

Label1.Text = builder.ToString();
0 голосов
/ 02 марта 2011

Я полагаю, что вы можете сделать это:

interestitems.IndexOf(inteitem);

Хотя это помогло мне с другими типами предметов, может дать вам представление.Я не проверял, работает ли он со строками.

Вы просто должны исключить последний, с проверкой индекса, если это последние с интересомiteitems.Count

0 голосов
/ 02 марта 2011

Вы можете заменить весь свой код некоторым LINQ:

Label1.Text = String.Join(", ",
              ListBox1.Items.Cast<ListItem>()
                            .Where(i => i.Selected)
                            .Select(i => i.Value.ToString())
              );

В .Net 3.5 вам нужно добавить .ToArray().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...