Решение
Вы можете просто проанализировать символы строки и проверить, содержат ли они предоставленные символы.
Вы получите наилучшую скорость и производительность памяти.
Использование метода расширения
static public class StringHelper
{
static public bool ContainsOnlyChars(this string strValue, params char[] charValues)
{
if ( string.IsNullOrEmpty(strValue) )
throw new ArgumentNullException("String cannot be null or empty.");
if ( charValues == null )
throw new ArgumentNullException("Chars cannot be null.");
for ( int index = 0; index < strValue.Length; index++ )
if ( !charValues.Contains(strValue[index]) )
return false;
return true;
}
}
Исполнение на короткой строке
С IndexOf
var chrono = new Stopwatch();
chrono.Start();
for ( int index = 0; index < 10000000; index++ )
{
"This a test string".ContainsOnlyChars('a', 'b', 'c', 'd');
}
chrono.Stop();
Console.WriteLine("Elapsed: " + chrono.ElapsedMilliseconds);
Debug Elapsed: 510
Release Elapsed: 178
с любым
Debug Elapsed: 747
Release Elapsed: 281
со всем
Debug Elapsed: 1193
Release Elapsed: 644
с ToLookup
Debug Elapsed: 1542
Release Elapsed: 870
С исключением, кроме
Debug Elapsed: 2195
Release Elapsed: 1423
со словарем
Debug Elapsed: 2947
Release Elapsed: 1900
Производительностьна большой строке
С IndexOf
var random = new Random();
string str = "";
for ( int index = 0; index < 10000; index++)
str += (char)random.Next(48, 127);
chrono.Start();
for ( int index = 0; index < 10000000; index++ )
{
str.ContainsOnlyChars('a', 'b', 'c', 'd', 'd', 'e', 'f', 'g', 'h');
}
chrono.Stop();
Console.WriteLine("Elapsed: " + chrono.ElapsedMilliseconds);
Release Elapsed: 327
С любым
Release Elapsed: 469
со всеми
Release Elapsed: 3733
с ToLookup
Release Elapsed: 4280
с исключением
Release Elapsed: 180562
Со словарем
Release Elapsed: 284176
Контрольный показатель фрагмента скрипта
Соображения
Дизайн скважиныЦикл d for
всегда будет самым быстрым и менее жадным в памяти, чем любой foreach или Linq.
Доказательство содержится в коде IL.
Foreach предназначен для того, чтобы забыть об управлении индексом, которыйможет генерировать ошибки, но это немного медленнее.
Linq предназначен для уменьшения количества строк, а также для улучшения обслуживания и уменьшения сложности, но для этого требуется много байтов, герц и времени.