4

在查看 C# 代码时,我经常看到这样的模式:

DataType[] items = GetSomeItems();
OtherDataType[] itemProps = new OtherDataType[items.Length];

int i = 0;
foreach (DataType item in items)
{
    // Do some stuff with item, then finally
    itemProps[i] = item.Prop;
    i++;
}

for 循环迭代 中的对象items,但也保留一个计数器 ( i) 用于迭代itemProps。我个人不喜欢这种额外的i闲逛,而是可能会做类似的事情:

DataType[] items = GetSomeItems();
OtherDataType[] itemProps = new OtherDataType[items.Length];

for (int i = 0; i < items.Length; i++)
{
    // Do some stuff with items[i], then finally
    itemProps[i] = items[i].Prop;
}

我不知道的第一种方法可能有一些好处吗?这是每个人都试图使用这种花哨foreach (...)语法的结果吗?我对你对此的看法很感兴趣。

4

7 回答 7

7

如果您使用的是 C# 3.0,那就更好了;

OtherDataType[] itemProps = items.Select(i=>i.Prop).ToArray();
于 2008-11-12T13:49:11.013 回答
4

如果 i 在数组之外,那么 if 在循环完成后将可用。如果您想计算项目的数量并且集合没有提供 .Count 或 .UBound 属性,那么这可能很有用。

像你一样,我通常会使用第二种方法,对我来说看起来更干净。

于 2008-11-12T13:46:55.030 回答
2

在这种情况下,我不这么认为。但有时,集合并没有实现this[int index],但它确实实现了 GetEnumerator()。在后一种情况下,您没有太多选择。

于 2008-11-12T13:46:29.787 回答
1

foreach (DataType item in items) 这个 foreach 循环清楚地表明您正在迭代所有 DataType 项目,嗯,是的,项目。也许它会使代码更长一点,但它不是一个“坏”的代码。对于另一个 for 循环,您需要检查括号内的内容以了解该循环的用途。

这个例子的问题在于你同时迭代两个不同的数组,我们不经常这样做..所以我们被困在两种策略之间..要么我们“有点”花哨-foreach 如你所说,或者我们回到旧的不那么受欢迎的 for(int i = 0; i ...)。(当然,除了这两种方法之外,还有其他方法)

所以,我认为这是 Vim 与 Emacs 的问题,在 For 与 Foreach 循环的问题中回归 :) 喜欢 for() 的人会说这个 foreach 没用,可能会导致性能问题,而且很大。喜欢 foreach 的人会说,如果我们可以轻松阅读代码和维护它,我们不在乎是否有两行额外的代码。

最后,我首先在第一个示例范围之外,在第二个示例范围内.. 原因是什么?!因为如果您在 foreach 之外使用 i ,我会以不同的方式调用。而且,在我看来,我更喜欢 foreach 方式,因为您可以立即看到正在发生的事情。您也不必考虑它是 < 还是 =。您立即知道您正在遍历所有列表,但是,遗憾的是,人们会忘记最后的 i++ :D 所以,我说 Vim!

于 2008-11-12T14:38:22.630 回答
1

从语义上讲,它们可能是等价的,但实际上在枚举器上使用 foreach 可以为编译器提供更多优化空间。

我不记得我脑海中的所有论点,但它们在有效 C#中有很好的介绍,推荐阅读。

于 2008-11-12T14:05:25.147 回答
1

Lets not forget that some collections do not implement a direct access operator[] and that you have to iterate using the IEnumerable interface which is most easily accessed with foreach().

于 2008-11-12T15:17:50.413 回答
1

一些数据结构不太适合随机访问,但可以非常快速地迭代(树、链表等)。因此,如果您需要迭代其中一个但由于某种原因需要计数,那么您注定要走丑陋的道路......

于 2008-11-12T13:51:30.683 回答