C# 如何使foreach指令在两个位置迭代?

C# 如何使foreach指令在两个位置迭代?,c#,wpf,C#,Wpf,如何使foreach指令在“files”变量和“names”数组中迭代 我试过两种选择。。第一个给了我很多错误,第二个显示了每种类型的8个图像 foreach(var file in files,var i in names) { //Do stuff } 及 你不能。改为使用for循环 for(int i = 0; i < files.Length; i++) { var file = files[i]; var name = names[i]; } for(int i=

如何使foreach指令在“files”变量和“names”数组中迭代

我试过两种选择。。第一个给了我很多错误,第二个显示了每种类型的8个图像

foreach(var file in files,var i in names)
{
//Do stuff
}


你不能。改为使用
for
循环

for(int i = 0; i < files.Length; i++)
{
   var file = files[i];
   var name = names[i];
}
for(int i=0;i

如果两个数组的长度相同,这应该可以工作。

不清楚您在问什么。但是,不能用foreach迭代两个迭代器;但您可以在foreach主体中增加另一个变量:

int i = 0;
foreach(var file in files)
{
   var name = names[i++];
   // TODO: do something with name and file
}

当然,这是假设文件和名称具有相同的长度。

我猜文件数组和名称数组具有相同的索引。 在这种情况下,如果您总是希望一次使用相同的索引,请执行以下操作:

for (int key = 0; key < files.Length; ++key)
{
  // access names[key] and files[key] here
}
for(int key=0;key
您可以尝试使用LINQ的Zip扩展方法:

 int[] numbers = { 1, 2, 3, 4 };
 string[] words = { "one", "two", "three" };

 var numbersAndWords = numbers.Zip(words, (first, second) => first + " " + second);

 foreach (var item in numbersAndWords)
    Console.WriteLine(item);
看起来像这样:

 var files = Directory.GetFiles(@".\GalleryImages");
 string[] names = new string[] { "Matt", "Joanne", "Robert", "Andrei", "Mihai","Radu","Ionica","Vasile"};
 var zipped = files.Zip(names, (f, n) => new { File = f, Name = n });
 foreach(var fn in zipped)
     Console.WriteLine(fn.File + " " + fn.Name);
var pairs = files.Zip(names, (f,n) => new {File=f, Name=n});
foreach (var item in pairs)
{
    Console.Write(item.File);
    Console.Write(item.Name);
}

但是我还没有测试过这一个。

你可以试试这样的东西:

 var files = Directory.GetFiles(@".\GalleryImages");
 string[] names = new string[] { "Matt", "Joanne", "Robert", "Andrei", "Mihai","Radu","Ionica","Vasile"};
 var zipped = files.Zip(names, (f, n) => new { File = f, Name = n });
 foreach(var fn in zipped)
     Console.WriteLine(fn.File + " " + fn.Name);
var pairs = files.Zip(names, (f,n) => new {File=f, Name=n});
foreach (var item in pairs)
{
    Console.Write(item.File);
    Console.Write(item.Name);
}

你有两个选择;第一种方法适用于迭代具有索引器的对象,如数组或
列表
,在这种情况下,使用简单的
for
循环并按索引访问对象:

for (int i = 0; i < files.Length && i < names.Length; i++)
{
  var file = files[i];
  var name = names[i];

  // Do stuff with names.
}

这两种方法都假设两个集合具有相同数量的项。
for
循环的迭代次数仅与较小的循环相同,较小的枚举数在项目用完时将从
MoveNext
返回
false
。如果一个集合比另一个集合大,“额外”的项目将无法处理,您需要弄清楚如何处理它们。

那么第二种方法有什么问题?你想达到什么目的?@user3522950你已经多次发布类似的问题。。。不是每个人都能理解所有的问题。啊,我讨厌在我注意到答案是重复问题之前就写下答案\
var filesEnum = files.GetEnumerator();
var namesEnum = names.GetEnumerator();

while (filesEnum.MoveNext() && namesEnum.MoveNext())
{

  var file = filesEnum.Current;
  var name = namesEnum.Current;

  // Do stuff with files and names.
}