抱歉标题不好。 下面的代码本身非常简单且不言自明。我基本上使用项目的索引(如果存在)。我不喜欢的是下面的代码实际上做了两次相同的事情(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}
答案 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);
}