Группировка с LINQ в C# - индекс за пределами - PullRequest
1 голос
/ 14 января 2020

Я пытаюсь сгруппировать строки по их расширению (последние три символа), чтобы обучить моим навыкам LINQ (я новичок ie), но я получаю исключение:

System.ArgumentOutOfRangeException: 'Индекс и длина должны указывать на местоположение в строке.

Мой код ниже: Где моя ошибка?

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

Ответы [ 2 ]

3 голосов
/ 14 января 2020

Как jdweng упоминается в разделе комментариев. Вам просто нужно использовать перегрузку Подстрока

Подстрока начинается с указанной позиции символа и продолжается до конца строки.

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
2 голосов
/ 14 января 2020

Поскольку ваши имена файлов могут содержать точки, положение точки может быть неправильным, если вы используете 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'
...