Сравнение массивов символов .NET - PullRequest
0 голосов
/ 03 декабря 2010

У меня есть следующий метод c # для получения правильного имени файла из предложенного имени:

public static string GetValidFilename(string fileNameCandidate)
{
    var invalids = System.IO.Path.GetInvalidFileNameChars();
    var _name = fileNameCandidate.ToCharArray();
    var validName = _name.Except(invalids).ToArray();
    return new string(validName);
}

То, что я ожидал, было исходным именем с удалением любых недопустимых символов от инвалидов. Тем не менее, я получаю оригинальное имя с недопустимыми символами имени файла и другими удаленными.
Например, если я вызвал метод с «ems: almcc_srr_view» в качестве входного параметра, я ожидал «emsalmcc_srr_view» в качестве выходного. Что я получаю, это «emsalc_rviw» в качестве выходного. Что я пропустил?

Ответы [ 4 ]

5 голосов
/ 03 декабря 2010

Enumerable.Except () создает «разность наборов» из двух последовательностей - это означает, что дублирующиеся символы на входе также будут удалены.

То, что вы хотите:

 _name.Where( x => !invalids.Contains(x) ).ToArray();

Поскольку System.String равно IEnumerable<char>, вы можете упростить это до:

var name = fileNameCandidate.Where( x => !invalids.Contains(x) ).ToArray() );
return new string( name );
4 голосов
/ 03 декабря 2010

Вы пропустили тот факт, что Except - это операция set . Другими словами, он дает последовательность, которая не содержит дубликатов. (По общему признанию документация могла бы быть намного более ясной в этом пункте.)

Вы хотите:

var validName = _name.Where(c => !invalids.Contains(c)).ToArray();

Обратите внимание, что вам не нужно вызывать _name.ToCharArray(), поскольку string уже реализует IEnumerable<char>. Другими словами, вы можете использовать:

public static string GetValidFilename(string fileNameCandidate)
{
    var invalids = Path.GetInvalidFileNameChars();
    var validName = fileNameCandidate.Where(c => !invalids.Contains(c))
                                     .ToArray();
    return new string(validName);
}
0 голосов
/ 03 декабря 2010

Попробуйте вместо этого:

return new string(fileNameCandidate.Where(c => !invalids.Contains(c)).ToArray());
0 голосов
/ 03 декабря 2010

Очевидно, что что-то идет не так, как было удалено одно 'c', а не другоеЯ бы посмотрел на это решение .

...