在 C# 中使用 LINQ 进行分组 - 索引越界
Grouping with LINQ in C# - Index out of bounds
我正在尝试根据扩展名(最后三个字符)对字符串进行分组以训练我的 LINQ 技能(我是新手),但我总是遇到异常:
System.ArgumentOutOfRangeException: 'Index and length must refer to a
location within the string.
我的代码如下:我的错误在哪里?
string[] files = new string[10] {"OKO.pdf","aaa.frx", "bbb.TXT", "xyz.dbf","abc.pdf", "aaaa.PDF","xyz.frt", "abc.xml", "ccc.txt", "zzz.txt"};
var res = from file in files
group file by file.Substring(file.IndexOf(".")+1,file.Length-1) into extensions
select extensions;
var res1 = files.GroupBy(file => file.Substring(file.IndexOf("."), file.Length - 1));
foreach(var group in res)
{
Console.WriteLine("There are {0} files with the {1} extension.", group.Count(), group.Key);
}
正如评论部分提到的jdweng。您只需要使用 Substring
的重载
The substring starts at a specified character position and continues
to the end of the string.
string[] files = new string[10] { "OKO.pdf", "aaa.frx", "bbb.TXT", "xyz.dbf", "abc.pdf", "aaaa.PDF", "xyz.frt", "abc.xml", "ccc.txt", "zzz.txt" };
var res = from file in files
group file by file.Substring(file.IndexOf(".") + 1) into extensions
select extensions;
foreach (var group in res)
{
Console.WriteLine("There are {0} files with the {1} extension.", group.Count(), group.Key);
}
结果将是:
There are 2 files with the pdf extension.
There are 1 files with the frx extension.
There are 1 files with the TXT extension.
There are 1 files with the dbf extension.
There are 1 files with the PDF extension.
There are 1 files with the frt extension.
There are 1 files with the xml extension.
There are 2 files with the txt extension
由于您的文件名可以包含点,如果您使用 IndexOf
,点的位置可能不正确。您可以使用 Split 方法解决此问题(请注意,有一个带点 OKO.ZOKO.pdf
的文件并查看输出):
static void other()
{
var names = new[] { "OKO.pdf", "OKO.ZOKO.pdf", "aaa.frx", "bbb.TXT", "xyz.dbf", "abc.pdf" };
var x = names.GroupBy(n => n.Split('.').Last());
x.ToList().ForEach(g => WriteLine($"There are {g.Count()} files with extension '{g.Key}'"));
}
// Output:
// There are 3 files with extension 'pdf'
// There are 1 files with extension 'frx'
// There are 1 files with extension 'TXT'
// There are 1 files with extension 'dbf'
我正在尝试根据扩展名(最后三个字符)对字符串进行分组以训练我的 LINQ 技能(我是新手),但我总是遇到异常:
System.ArgumentOutOfRangeException: 'Index and length must refer to a location within the string.
我的代码如下:我的错误在哪里?
string[] files = new string[10] {"OKO.pdf","aaa.frx", "bbb.TXT", "xyz.dbf","abc.pdf", "aaaa.PDF","xyz.frt", "abc.xml", "ccc.txt", "zzz.txt"};
var res = from file in files
group file by file.Substring(file.IndexOf(".")+1,file.Length-1) into extensions
select extensions;
var res1 = files.GroupBy(file => file.Substring(file.IndexOf("."), file.Length - 1));
foreach(var group in res)
{
Console.WriteLine("There are {0} files with the {1} extension.", group.Count(), group.Key);
}
正如评论部分提到的jdweng。您只需要使用 Substring
的重载The substring starts at a specified character position and continues to the end of the string.
string[] files = new string[10] { "OKO.pdf", "aaa.frx", "bbb.TXT", "xyz.dbf", "abc.pdf", "aaaa.PDF", "xyz.frt", "abc.xml", "ccc.txt", "zzz.txt" };
var res = from file in files
group file by file.Substring(file.IndexOf(".") + 1) into extensions
select extensions;
foreach (var group in res)
{
Console.WriteLine("There are {0} files with the {1} extension.", group.Count(), group.Key);
}
结果将是:
There are 2 files with the pdf extension.
There are 1 files with the frx extension.
There are 1 files with the TXT extension.
There are 1 files with the dbf extension.
There are 1 files with the PDF extension.
There are 1 files with the frt extension.
There are 1 files with the xml extension.
There are 2 files with the txt extension
由于您的文件名可以包含点,如果您使用 IndexOf
,点的位置可能不正确。您可以使用 Split 方法解决此问题(请注意,有一个带点 OKO.ZOKO.pdf
的文件并查看输出):
static void other()
{
var names = new[] { "OKO.pdf", "OKO.ZOKO.pdf", "aaa.frx", "bbb.TXT", "xyz.dbf", "abc.pdf" };
var x = names.GroupBy(n => n.Split('.').Last());
x.ToList().ForEach(g => WriteLine($"There are {g.Count()} files with extension '{g.Key}'"));
}
// Output:
// There are 3 files with extension 'pdf'
// There are 1 files with extension 'frx'
// There are 1 files with extension 'TXT'
// There are 1 files with extension 'dbf'