c# - 如何从列表列表中选择项目

标签 c# .net list

我需要一点帮助。我有一个 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/

相关文章:

python - 我想在Python中将分类变量转换为数值

c# - 将 C# double 与指定值进行比较是否安全?

javascript - 如何读取 HTML 文档文本并替换 API 调用响应中括号内的字符串

c# - C# 动态程序集中的自引用枚举属性

r - 折叠一个数据框列表并与 R 中的另一个数据框列表组合

list - 如何避免 SWI-Prolog 中的 "out of global stack"错误?

c# - 创建 Action<T>,其中 T 是方法参数的基类

c# - WPF 列表框绑定(bind) : SelectedItem not setting

.net - 将数据保存在简单的 .NET Windows 应用程序中的什么位置?

c# - 不能将 long 类型转换为 T,这里 T 是一个 Enum 的值