识别循环的第一次迭代,c#

Posted

技术标签:

【中文标题】识别循环的第一次迭代,c#【英文标题】:Identifying the first iteration of a loop, c# 【发布时间】:2013-08-22 11:57:35 【问题描述】:

这是非常基本的,但我想知道是否有更好的方法来编写以下概念。

 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

因此,尽管这可行,但每次循环检查这确实是循环的第一次迭代似乎是在浪费计算机时间,尤其是当此循环嵌套在递归方法中时。有没有更好的方法来做到这一点?

(记住for循环条件中的node.ChildNodes[i].Attributes.Count可能为0,即节点(它是一个xmlNode)可能没有子节点,因此循环加倍为存在也检查孩子们。)

我希望我解释得很好!

【问题讨论】:

你考虑过String.Join 吗?它会自动执行此操作。 从第二次迭代开始,总是在添加下一个字符串之前添加, 【参考方案1】:

试试string.Join

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

【讨论】:

谢谢!我不太了解.Select(a => a.Name),具体是怎么做的,我知道功能是遍历元素每个属性的名称,但我不知道如何【参考方案2】:

使用string.Join 方法。这是一种在一行中完成整个事情的华丽方法:

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

【讨论】:

1) 确保在文件顶部有 using System.Linq; 作为命名空间导入之一。 2) 如果ChildNodes 不是通用可枚举类型,您可能必须在调用SelectMany 之前调用Cast&lt;Node&gt;()。如果 Linq 的东西让你感到困惑,你最好把它写成一个 foreach 循环。【参考方案3】:

如果你想用循环来做,从第二次迭代开始:

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

这就是一般的想法

【讨论】:

以上是关于识别循环的第一次迭代,c#的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode0001.两数之和

是啥导致我的循环仅在第一次迭代中忽略此“\t”?

C# 使用IEnumerable,yield 返回结果,同时使用foreach时,在循环内修改变量的值无效

"for" 循环第一次迭代

Python:为啥这个 for 循环在第一次迭代后退出?

第一次迭代后循环停止