将路径拆分为列表

时间:2015-08-11 07:37:00

标签: c# arrays list

我很想找到解决这个问题的聪明方法。 我有一个包含某些文件路径的列表。

路径看起来像这样:

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

我必须创建一个列表,其中包含列表中每个String的路径的第一部分,然后是包含第二部分的列表,依此类推。我相信在每个String上使用拆分器是在填充列表之前将其添加到数组的方法。据我所知,如果使用所描述的第一个字符串的.Split('/'),将创建一个包含3个子串的数组。我已经明白“晚餐”会出现在Array[0]上,“汤”出现在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。

我只是设法得到第一个清单的正确答案。我想过让一个方法接受字符串并多次调用该方法。

1 个答案:

答案 0 :(得分:3)

您可以使用此方法:

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();