2013-08-22 71 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 

所以,雖然這個工程,它似乎的計算機浪費時間在每次循環,這的確是循環的第一次迭代的時間來檢查,ES因爲這個循環嵌套在遞歸方法中。有沒有更好的方法來做到這一點? (考慮到for循環條件中的node.ChildNodes [i] .Attributes.Count可能爲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 '孩子節點的一種方法:( – user2707220

+0

1)確保你有'使用System.Linq;'作爲你的文件頂部的一個命名空間導入。 2)如果'ChildNodes'不是泛型可枚舉類型,則在調用'SelectMany'之前,可能需要調用'Cast ()'。如果Linq的東西混淆你,你最好把它寫成foreach-loop。 –