首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将路径拆分为列表

将路径拆分为列表
EN

Stack Overflow用户
提问于 2015-08-11 07:37:00
回答 1查看 115关注 0票数 1

我绞尽脑汁地想办法解决这个问题。我有一个包含某些文件路径的列表。

这些路径看起来是这样的:

代码语言:javascript
运行
复制
"Dinner/Soup/CurrySoup"
"Dinner/Soup/ChickenSoup/Croutons"
"Dinner/Beef/RibEye/Sauce/"
"Breakfast/Cereal/Kellogs"

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

对于那些想看看我自己尝试过什么的人来说,以下是我所做的:

代码语言:javascript
运行
复制
            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。

我只得到了第一个列表的正确答案。我考虑过创建一个方法,接受字符串并多次调用该方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-11 07:54:57

您可以使用以下方法:

代码语言:javascript
运行
复制
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方法:

代码语言:javascript
运行
复制
var indexLookup = allTokens
    .Select(arr => arr.Select((Token, Index) => new { Token, Index }))
    .SelectMany(x => x)
    .ToLookup(x => x.Index);

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

为给定索引获取List<String>的方式如下:

代码语言:javascript
运行
复制
List<string> index2List = indexLookup[2].Select(x => x.Token).ToList();

结果:

代码语言:javascript
运行
复制
"CurrySoup" 
"ChickenSoup"   
"RibEye"    
"Kellogs"   

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

代码语言:javascript
运行
复制
List<List<string>> allLists = Enumerable.Range(0, indexLookup.Count)
    .Select(i => indexLookup[i].Select(x => x.Token).ToList())
    .ToList();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31935861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档