c# - 将路径拆分为列表

标签 c# arrays list

我正在努力寻找解决此问题的巧妙方法。 我有一个包含某些文件路径的列表。

路径可能是这样的:

"Dinner/Soup/CurrySoup"
"Dinner/Soup/ChickenSoup/Croutons"
"Dinner/Beef/RibEye/Sauce/"
"Breakfast/Cereal/Kellogs"

我必须创建一个列表,其中包含列表中每个字符串的路径的第一部分,然后是一个包含第二部分的列表,依此类推。我相信在每个字符串上使用拆分器是在填充列表之前将其添加到数组的方法。据我所知,如果使用描述的第一个字符串的 .Split('/') ,将创建一个包含 3 个子字符串的数组。我已经了解到“Dinner”将在 Array[0] 上,“Soup”将在 Array[1] 上等等……现在是真正的问题。我可以让它适用于 1 个字符串,但是使用变量来定义子字符串应该转到哪个列表的索引,这似乎给我带来了麻烦,因为它不止一个路径,而且创建了 10 个列表来处理对于路径,这可能很长(比如 10 条?)似乎有些矫枉过正。有什么想法吗?

对于那些想看看我自己尝试了什么的人,这是我所做的:

            List<string> list = new List<string>();
        List<string> listCategory1 = new List<string>();
        List<string> listCategory2 = new List<string>();
        List<string> listCategory3 = new List<string>();

        string s;

        list.Add("category1/category2/category3");
        list.Add("category1/category2/category4");
        list.Add("category6/category7/category8");

        foreach (String s1 in list) 
        {
            String[] a = s1.Split('/');

            int i = 0;

                if(i==0)
                {
                    listCategory1.Add(a.ElementAt(i));
                    i++;
                }
                if (i == 1)
                {
                    listCategory1.Add(a.ElementAt(i));
                    i++;
                }
                if (i == 2)
                {
                    listCategory1.Add(a.ElementAt(i));
                    i++;
                }
        }

        Console.WriteLine(listCategory1.ElementAt(0));
        Console.WriteLine(listCategory1.ElementAt(1));
        Console.WriteLine(listCategory1.ElementAt(2));

控制台输出为:category1, category2, category3。

我只设法得到第一个列表的正确答案。我想过制作一个方法来接收字符串并多次调用该方法。

最佳答案

您可以使用这种方法:

var allTokens = paths.Select(p => p.Split(new[]{'/'}, StringSplitOptions.RemoveEmptyEntries));
int maxLength = allTokens.Max(tokens => tokens.Length);
var allLists = new List<List<string>>(maxLength);
for (int i = 0; i < maxLength; i++) allLists.Add(new List<string>());
foreach (string[] tokens in allTokens)
    for (int i = 0; i < tokens.Length; i++)
        allLists[i].Add(tokens[i]);

这是解决这个问题最自然的方法。这是强制性的 LINQ 方法:

var indexLookup = allTokens
    .Select(arr => arr.Select((Token, Index) => new { Token, Index }))
    .SelectMany(x => x)
    .ToLookup(x => x.Index);

现在你有一个类似于字典的查找,但允许重复的键,也可以查找不存在的键(返回一个空序列)。

你得到一个 List<String>对于给定的索引,采用以下方式:

List<string> index2List = indexLookup[2].Select(x => x.Token).ToList();

结果:

"CurrySoup" 
"ChickenSoup"   
"RibEye"    
"Kellogs"   

如果您想知道如何使用查找方法获取 List<List<string>> :

List<List<string>> allLists = Enumerable.Range(0, indexLookup.Count)
    .Select(i => indexLookup[i].Select(x => x.Token).ToList())
    .ToList();

关于c# - 将路径拆分为列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31935861/

相关文章:

c# - 在一行代码中初始化对象属性

java - 如何打乱整数数组中的元素?

arrays - 在Matlab中将一个数组的变量放入另一个数组的一行中

c - 列表连接算法如何工作?

c# - Telerik Reporting 在本地生成 pdf,但不在 Azure 上生成

c# - Generics Fun : Where typeof(List<T>) ! = typeof(List<T>),并使用反射获取泛型方法,带有泛型参数

c# - 如何在单元测试中断言字典

C、字符串数组不会弃用从字符串常量到 'char*' 的转换

python - 组合和排序元组列表的最快方法是什么?

C# 使用 foreach 遍历包含 2 个不同对象类的列表