2013-08-22 5 views
0

Это очень простой, но мне было интересно, есть ли лучший способ программирования следующей концепции.Идентификация первой итерации цикла, C#

for (int j = 0; j < node.ChildNodes[i].Attributes.Count; j++) 
       { 
        if (j != 0) row.Cells[1].Value += ", "; 
        row.Cells[1].Value += node.ChildNodes[i].Attributes[j].Name; 
       } 

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

row.Cells[1].Value += ", " + node.ChildNodes[i].Attributes[j].Name; 

в противном случае выход в ячейке будет выглядеть примерно так:

, name, day 

вместо

name, day 

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

(Принимая во внимание, что node.ChildNodes [i] .Attributes.Count в условиях цикла for может быть 0, то есть узел (который является xmlNode) не может иметь дочерних узлов, поэтому цикл удваивается как проверка наличия у детей тоже.)

Надеюсь, я объяснил это хорошо!

+4

Вы считаете «String.Join'? Он делает это автоматически. – asawyer

+0

Просто начните со второй итерации и всегда добавляйте ',' перед добавлением следующей строки – ppetrov

ответ

4

Попробуйте string.Join

var commaSeperated = string.Join(", ", node.ChildNodes[i].Attributes.Select(a => a.Name)); 
+0

Спасибо! Я не совсем понимаю .Select (a => a.Name), как это делается конкретно, я знаю, что функциональность заключается в том, чтобы просматривать имена каждого атрибута элемента, но я не знаю, как – user2707220

0

Если вы хотите сделать это с помощью цикла, начните со второй итерации:

string result = array[0]; 
for(int i = 1; i < array.Length; i++) 
    result += ", " + array[i]; 

, что общая идея

2

Используйте метод string.Join. Вот критический способ сделать все это в одной строке:

row.Cells[1].Value = string.Join(", ", node.ChildNodes 
    .SelectMany(node => node.Attributes.Select(attribute => attribute.Name))) 
+0

Это говорит мне, что selectmany isn 't метод childnodes :( – user2707220

+0

1) Убедитесь, что вы используете 'System.Linq;' как одно из ваших имён импорта в верхней части файла. 2) Если 'ChildNodes' не является общим перечисляемым типом, вам может потребоваться вызвать' Cast () 'на нем перед вызовом' SelectMany'. Возможно, вам лучше написать это как петлю foreach, если материал Linq смущает вас. –

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