在两个foreach循环中访问字符串数组列表

时间:2019-06-16 05:55:31

标签: c#

到目前为止,我已经做到了:

List<string[]> VList

foreach (var item in VList)
{

    foreach (var b in item)
    {
         Richtextbox 1 = VList[item][b]?
    }
}

我该如何纠正?我要它写列表中包含的所有内容

2 个答案:

答案 0 :(得分:2)

一个foreach循环使用IEnumerator 1 迭代一个集合 1
在每次迭代中,循环变量(在您的情况下为itemb)都引用IEnumerator.Current属性所引用的内容。

方括号[]用于一种称为indexers的特殊属性。索引器通常在collection 2 中使用,以提供对与该特定索引耦合的集合所拥有的内容的引用。

在使用foreach循环时,您不需要知道集合中某个元素的索引-实际上,该集合甚至不必支持索引-您已经有了一个通过循环变量对其进行引用。

因此,使用嵌套foreach循环对类型为List<string[]>的变量中的字符串进行处理的代码将是这样的:

foreach(var stringArray in VList)
{
    foreach(var str in stringArray)
    {
        // do something with str here...
    }
}

如果要使用索引器,请改用for循环:

for(var i=0; i<VList.Count; i++)
{
    for(var j=0; j<VList[i].Length; j++)
    {
        // do something with VList[i][j] here...
    }
}


1 实际上,foreach循环不需要使用实际的集合。
它只需要一个实例,该实例的方法名为GetEnumerator(),该方法返回一个对象,该对象具有一个名为Current的公共属性和一个名为MoveNext的公共方法。 这意味着,即使您有一个没有实现IEnumerable接口但具有GetEumerator方法的类,并且该方法返回的其他类的实例也没有实现{{1 }}接口,但具有IEnumerable属性和Current方法,您仍然可以使用MoveNext。这称为duck typing

这已记录在foreach, in (C# reference)


2 类型具有索引器的事实并不一定意味着该类型是一个集合-将indexres添加到您自己的类型而无需实现通常实现的任何接口集合(例如{{1 }}或foreach

答案 1 :(得分:1)

您的访问权限有误。您正在遍历元素,无需使用数组/索引器访问。 []

List<string[]> VList

foreach (var item in VList)
{

    foreach (var b in item)
    {
         Richtextbox1.text += b
    }
}