如何迭代“之间”数组/集合/列表中的项目?
这个问题困扰了我很多年,当有更好的解决方案时,我总是觉得我正在想出一个办法。当您想要对列表中的所有项目执行某些操作,然后在这些项目之间添加某些内容时,就会出现当前的问题。简而言之,我想要:
- 对列表中的每个项目执行一些操作。
- 对列表中除最后一项之外的所有项目执行其他操作(实际上,在列表中的项目“之间”执行某些操作)。
例如,假设我有一个名为 Equation
的类:
public class Equation
{
public string LeftSide { get; set; }
public string Operator { get; set; }
public string RightSide { get; set; }
}
我想迭代 Equation
列表并返回一个将这些项格式化在一起的字符串;类似以下内容:
public string FormatEquationList(List<Equation> listEquations)
{
string output = string.Empty;
foreach (Equation e in listEquations)
{
//format the Equation
string equation = "(" + e.LeftSide + e.Operator + e.RightSide + ")";
//format the "inbetween" part
string inbetween = " and ";
//concatenate the Equation and "inbetween" part to the output
output += equation + inbetween;
}
return ouput;
}
上面代码的问题是它将在返回字符串的末尾包含 and
。我知道我可以将一些代码组合在一起,将 foreach
替换为 for
循环,并仅在不是最后一个时添加 in Between
元素物品;但这似乎是一个黑客。
是否有处理此类问题的标准方法?
This problem has bugged me for years, and I always feel like I'm coming up with a hack when there's a much better solution. The issue at hand occurs when you want to do something to all items in a list and then add something inbetween those items. In short, I want to:
- Do something to every item in the list.
- Do something else to all but the last item in the list (in effect, do something "inbetween" the items in the list).
For example, let's say I have a class called Equation
:
public class Equation
{
public string LeftSide { get; set; }
public string Operator { get; set; }
public string RightSide { get; set; }
}
I want to iterate over a list of Equation
s and return a string that formats these items together; something like the following:
public string FormatEquationList(List<Equation> listEquations)
{
string output = string.Empty;
foreach (Equation e in listEquations)
{
//format the Equation
string equation = "(" + e.LeftSide + e.Operator + e.RightSide + ")";
//format the "inbetween" part
string inbetween = " and ";
//concatenate the Equation and "inbetween" part to the output
output += equation + inbetween;
}
return ouput;
}
The problem with the above code is that it is going to include and
at the end of the returned string. I know that I could hack some code together, replace the foreach
with a for
loop, and add the inbetween
element only if it's not the last item; but this seems like a hack.
Is there a standard methodology for how to deal with this type of problem?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
我喜欢已经发布的 String.Join 方法。
但是,当您不使用数组时,这通常是我解决此问题的方法:
当然,使用 StringBuilder 通常更快:
I like the String.Join method already posted.
But when you're not using an Array this has normally been my solution to this problem:
Of course, it's usually faster to use a StringBuilder:
您基本上有几种不同的策略来处理此类问题:
这些选项中的任何一个都可以是实现“项目之间”样式算法的合法方式。您选择哪一个取决于以下因素:
等等。对于字符串的具体情况,我个人更喜欢使用
string.Join()
,因为我发现它最清楚地说明了意图。另外,对于字符串,如果您不使用 string.Join(),您应该尝试使用 StringBuilder 以避免创建太多临时字符串(结果.Net 中的字符串是不可变的)。以字符串连接为例,不同的选项分为如下示例。 (为简单起见,假设方程的
ToString()
为:"(" + LeftSide + Operator + RightSide + ")"
第二个选项看起来像:
第三个 选项看起来像例如:
最后一个选项在 .NET 中可以采用多种形式,使用 String.Join 或 Linq:
或者:就
我个人而言,我避免使用 Aggregate() 进行字符串连接,因为它会产生许多中间的、被丢弃的字符串它也不是将一堆结果“连接”在一起的最明显的方式 - 它主要用于以某种任意的、调用者定义的方式从集合中计算“标量”结果。
You basically have a few different strategies for dealing with this kind problem:
Any of these options can be a legitimate way to implement a "between the items" style of algorithm. Which one you choose depends on things like:
Amongst other things. For the specific case of string, I personally prefer using
string.Join()
, as I find it illustrates the intent most clearly. Also, in the case of strings, if you aren't usingstring.Join()
, you should try to useStringBuilder
to avoid creating too many temporary strings (a consequence of strings being immutable in .Net).Using string concatentation as the example, the different options break down into examples as follows. (For simplicity, assume Equation has
ToString()
as:"(" + LeftSide + Operator + RightSide + ")"
The second option looks like:
The third would look something like:
The last option can take multiple forms in .NET, using either String.Join or Linq:
or:
Personally, I avoid using
Aggregate()
for string concatenation because it results in many intermediate, discarded strings. It's also not the most obvious way to "join" a bunch of results together - it's primarily geared for computing a "scalar" results from a collection in some arbitrary, caller-defined fashion.您可以使用String.Join()。
You can use String.Join().
您可以使用 LINQ 的
Aggregate
运算符来执行此操作:You can do this with LINQ's
Aggregate
operator:如果您不需要
foreach
循环,则使用带有计数器的for
循环是完全合理的。这就是为什么有不止一种类型的循环语句的原因。如果要成对处理项目,请在 LINQ 的
Aggregate
运算符处循环。Using a
for
loop with counter is perfectly reasonable if you don't want aforeach
loop. This is why there is more than one type of looping statement.If you want to process items pairwise, loop at LINQ's
Aggregate
operator.我通常将其添加在条件之前,并检查它是否是第一项。
我不得不说我也会看看 string.Join() 函数,+1 表示 Linqiness 。我的例子是一个更传统的解决方案。
I usualy add it before the condition, and check if its the 1st item.
I have to say I would look at the string.Join() function as well, +1 for Linqiness on that. My example is a more of a traditional solution.
我通常尝试根据条件为分隔符添加前缀,而不是将它们添加到末尾。
0和1和2和3和4和5和6和7和8和9
I generally try to prefix separators based on a condition rather than add them to the end.
0 and 1 and 2 and 3 and 4 and 5 and 6 and 7 and 8 and 9