我绞尽脑汁地想办法解决这个问题。我有一个包含某些文件路径的列表。
这些路径看起来是这样的:
"Dinner/Soup/CurrySoup"
"Dinner/Soup/ChickenSoup/Croutons"
"Dinner/Beef/RibEye/Sauce/"
"Breakfast/Cereal/Kellogs"我必须创建一个列表,其中包含列表中每个字符串的路径的第一部分,然后是包含第二部分的列表,等等。我相信在每个字符串上使用拆分器是在填充列表之前将其添加到数组中的方法。据我所理解,如果使用所描述的第一个字符串的.Split('/'),将创建一个包含3个子字符串的数组。我的理解是,“晚餐”在Array[0]上,"Soup“在Array[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。
我只得到了第一个列表的正确答案。我考虑过创建一个方法,接受字符串并多次调用该方法。
发布于 2015-08-11 07:54:57
您可以使用以下方法:
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();https://stackoverflow.com/questions/31935861
复制相似问题