我正在努力寻找解决此问题的巧妙方法。我有一个包含某些文件路径的列表。
路径可能是这样的:
"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();
我是一名优秀的程序员,十分优秀!