循环这个的最好方法是什么

时间:2018-01-27 14:02:03

标签: c# for-loop while-loop

抱歉标题不好。 下面的代码本身非常简单且不言自明。我基本上使用项目的索引(如果存在)。我不喜欢的是下面的代码实际上做了两次相同的事情(someList.IndexOf)。

while(someList.IndexOf(something) != -1)
{
 int index = someList.IndexOf(something); 
 //other stuff (someList and something will change here)
}

我想知道是否有更好的方法来做到这一点。我想再次在循环中使用值(原谅我缺乏术语),比如在for循环中使用“i”。

while(value) { //use the value here}

6 个答案:

答案 0 :(得分:1)

只需在while循环中设置并测试即可。

while((someIndex = someList.IndexOf(something)) != -1){

}

答案 1 :(得分:0)

您可能想尝试实现更具可读性的 for循环,而不是while循环:

  for(int index = someList.IndexOf(something); 
          index >= 0; 
          index = someList.IndexOf(something)) {
    ...
  } 

请注意,没有开销(计算IndexOf两次)和循环声明中的所有内容,因此您可以放置​​continue而无需任何其他代码

答案 2 :(得分:0)

更好你的意思并不完全清楚,尽管我只能假设你想达到“可维护性”和“表现力”之间的某种交集。然而,即使采用这种形式的清晰度,您也需要向我们描述一个现实世界的问题,以便我们为您提供最好的帮助。这个网站通常不适合这类问题。因此,我投票结束。

在考虑这些标准中的任何一个时,重复表达式index = someList.IndexOf(something)是不可接受的(只是,因为看起来,请注意)。因此,普通for循环的选项可能不合适(再次,仅略微)。

您可以将分配提升到循环控件,但似乎这可能会影响可维护性,因为所需的额外嵌套括号会使代码看起来不那么透明/立即易于理解......

在程序编程的世界里,我的建议是从你通常放置它的位置(在控制表达式中)中提取循环控件并将其嵌入相反,循环。例如:

for (;;) {
    int index = someList.IndexOf(something);
    if (index == -1) {
        break;
    }

    // XXX: Make use of `index` here.
}

这符合两个标准;它不会不必要地重复代码,它是惯用的,易于阅读和理解。当然,由于C#引入了许多工具,包括内部化循环的一些功能方面,因此引入了更多选项来考虑这样一个模糊的问题。例如,您可以使用Aggregate方法生成新列表,并将其分配给旧列表的顶部,如下所示:

someList = someList.Aggregate(new List(T), (list, item) => {
               if (item != something) { list.Add(item); }
               else { /* XXX: Do something else */ }
               return list;
           });

这不太可能是您所有选择的详尽答案; 因为您没有向我们提供有关更广泛图片的信息(您尝试解决的现实生活中的问题),这可能是XY problem ,因此可能有问题要点当“真实世界问题”被定义时,“你认为你需要____的原因是什么?”这个问题。

答案 3 :(得分:0)

只是投入另一种可能的解决方案。您可以添加一个扩展方法,并在循环本身没有-1幻数的情况下使其更具可读性。

public static class ListExtensions
{
    public static bool TryGetIndexOf<T>(this IList<T> source, T item, out int index)
    {
        if(source == null) throw new ArgumentNullException(nameof(source));

        index = source.IndexOf(item);
        return index != -1;
    }
}

然后你的循环变为:

List<int> someList = new List<int> { 5, 10, 15, 20 };
int something = 5;

while (someList.TryGetIndexOf(something, out var idx))
{
    something += 5;
}

答案 4 :(得分:-1)

int someIndex = someList.IndexOf(something);

while( someIndex != -1)
{
    // do something to something so someIndex changes

    someIndex = someList.IndexOf(something)
}

在离开列表之前,你基本上是做某事。所以你也可以使用:

using System.Linq;

var something = someList[7]; // get your item from someList

while( !someList.Any( elem => elem == something))
{
    // if this is practicable depends on your "things" to do to something
}

答案 5 :(得分:-1)

int index = someList.IndexOf(something);
while(index != -1)
{
    // compute values for someList and something
    //other stuff (someList and something will change here)
    index = someList.IndexOf(something);
}