我需要一点帮助。我有一个 5k 元素的列表,它是文件的路径。我将该列表分成五个较小的列表。我的问题是如何循环列表列表并在同一迭代中从所有五个元素中选取元素。
代码示例。 来源列表:
List<string> sourceDir = new List<string>(new string[] { "C:/Temp/data/a.txt", "C:/Temp/data/s.txt", "C:/Temp/data/d.txt", "C:/Temp/data/f.txt", "C:/Temp/data/g.txt", "C:/Temp/data/h.txt", "C:/Temp/data/j.txt", "C:/Temp/data/k.txt", "C:/Temp/data/l.txt", "C:/Temp/data/z.txt"});
将列表拆分为更小的列表:
public static List<List<T>> Split<T>(IList<T> source)
{
return source
.Select((x, i) => new { Index = i, Value = x })
.GroupBy(x => x.Index / 2)
.Select(x => x.Select(v => v.Value).ToList())
.ToList();
}
结果:
var list = Split(sourceDir);
作为变量列表的结果,我得到五个列表。我现在如何在一次迭代中访问所有列表中的项目以进行进一步处理? 像这样的东西:
foreach (string fileName in list[0])
{
foreach (string fileName1 in list[1])
{
foreach (string fileName2 in list[2])
{
foreach (string fileName3 in list[3])
{
foreach (string fileName4 in list[4])
{
//have items from all lists
Console.WriteLine("First name is: " + fileName);
Console.WriteLine("Second name is: " + fileName1);
Console.WriteLine("Third name is: " + fileName2);
Console.WriteLine("Fourth name is: " + fileName3);
Console.WriteLine("Fift name is: " + fileName4);
break;
}
break;
}
break;
}
break;
}
continue;
}
上面的 foreach 循环只是为了了解我需要什么。
最佳答案
文件 IO 操作上的多线程并不总是一个好的选择。您增加了线程切换的开销,但磁盘访问必然要考虑其他因素。看看这里的例子
Does multithreading make sense for IO-bound operations?
但是,为了回答您的问题,您可以使用标准的 for 循环而不是所有那些 foreach,您唯一需要注意的是子列表没有相同数量的元素的情况。 (文件数量不能被5整除)
int maxIndex = Math.Max(list[0].Count,
Math.Max(list[1].Count,
Math.Max(list[2].Count,
Math.Max(list[3].Count, list[4].Count))));
for (int x = 0; x < maxIndex; x++)
{
string item0 = x < list[0].Count ? list[0][x] : "No item";
string item1 = x < list[1].Count ? list[1][x] : "No item";
string item2 = x < list[2].Count ? list[2][x] : "No item";
string item3 = x < list[3].Count ? list[3][x] : "No item";
string item4 = x < list[4].Count ? list[4][x] : "No item";
Console.WriteLine("First name is: " + item0);
Console.WriteLine("Second name is: " + item1);
Console.WriteLine("Third name is: " + item2);
Console.WriteLine("Fourth name is: " + item3);
Console.WriteLine("Fifth name is: " + item4);
}
关于c# - 如何从列表列表中选择项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73267820/