当前位置: 首页 > 编程语言 > C#

C#新手:找出foreach块中的索引share

时间:2023-04-11 12:16:35 C#

调试目的。作为C#新手,我执行以下操作:inti=1;foreach(xiny){...做点什么...WriteDebug("Step:"+i.ToString());我++;我想知道是否有任何方法可以在不为此明确创建变量的情况下获取当前步骤索引的值。编辑:澄清一下,我显然熟悉for循环选项,但它不是我正在经历的数组,而是一个无序集合。编号的原因只是为了显示调试级别的进度,仅此而已。不,不在那里。这是一个示例,您最好使用基本的for循环for(inti=0;i而不是每个循环我是一名钻工,我会选择为Marc的回答这样做。与其他一些答案相反,我非常乐意将foreach与计数器混合(根据问题中的代码)。这保留在没有索引器的情况下使用IEnumerable[]的能力。但是如果你愿意,在LINQ中:foreach(varpairiny.Select((x,i)=>new{Index=i,Value=x})){.WriteLine(pair.Index+":"+pair.Value);}(题目中的反击方法更简单高效,不过上面应该更能映射到一些场景比如Parallel.ForEach)不是,实际上,foreach循环中没有隐式的“计数器”。foreach循环在幕后所做的是创建一个IEnumerator,然后一项一项地循环,在IEnumerator接口上调用.MoveNext()方法。(不幸的是?)IEnumerator接口上没有公开计数器变量-只有.Reset()和.MoveNext()方法和Current属性(返回当前项目)Scum您的方法应该尽可能清晰。但是,您可能要注意i++部分实际上与循环的核心功能无关(不涉及计数/长度/其他参数)。因此,您可能需要考虑将writeDebug和i++移动到单独的方法/类(updateProgress())中,并简单地从循环中调用它。foreach使用IEnumerator接口,该接口具有Current属性以及MoveNext和Reset方法。Current返回Enumerator当前所在的对象,MoveNext将Current更新为下一个对象。foreach中没有索引的概念,枚举的顺序我们也不确定。您必须为此应用变量或改用for循环。我更喜欢使用forlop而不是使用变量来跟踪它。不,没有办法将它放入foreach循环中。对于这种情况,您应该使用for循环,或者如您所述,显式创建一个用于计数的变量。这取决于您正在循环的枚举器的实际类型。但是,许多集合都有一个IndexOf方法ArrayListarrayList=newArrayList();arrayList.Add("A");arrayList.Add("B");arrayList.Add("C");foreach(arrayList中的字符串项){inti=arrayList.IndexOf(item);}当然,如果列表中有重复项,这将不起作用。它也不是最有效的解决方案。我会坚持使用您的原始版本,只保留一个变量来跟踪索引。我不知道你的例子中的“y”到底是什么,但也许你可以这样写:foreach(varxiny.WithIndex()){WriteDebug(String.Format("Step:{0}",x.索引));}如果您将以下扩展类添加到您的项目中:变种位置=0;foreach(源中的T值){yieldreturnnewIndexValuePair(position++,value);}}}publicclassIndexValuePair{publicIndexValuePair(Int32index,Tvalue){this.index=index;this.value=value;私有只读Int32索引;publicInt32Index{get{返回索引;}}私有只读T值;publicTValue{get{返回值;}}}HTH,Dejan如果你绝对需要一个索引,使用传统的for循环。以上就是C#学习教程:C#新手:找出foreach块中索引共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注---for(inti=0;i本文收集自网络,不代表立场。如涉及侵权,请点击维权联系管理员删除,如需转载请注明出处:

最新推荐
猜你喜欢