Сравнение строки с несколькими разными строками - PullRequest
3 голосов
/ 15 января 2010

Я хочу сравнить одну строку со многими. Как это делается в C #?

Ответы [ 7 ]

10 голосов
/ 15 января 2010

Если вы хотите проверить, содержится ли строка в списке строк, вы можете использовать метод расширения Contains:

bool isStringContainedInList = 
    new[] { "string1", "string2", "string3" }.Contains("some string")
6 голосов
/ 15 января 2010

Я рекомендую вам взглянуть на эту википедию статью о самой длинной общей подстроке .

Я вспоминаю из старшекурсника, что одну стратегию, чтобы найти самую длинную общую подстроку, вы можете начать с поиска немного более короткой подстроки, а затем расширить ее оттуда (и повторить). То есть, если «abcd» является общей подстрокой, то так же, как и «abc», и «ab».

Это позволяет использовать повторяющийся алгоритм, в котором вы сначала найдете все двухбуквенные пары, которые появляются в ваших строках (я не беспокоюсь о подстроках из одной буквы, потому что для большого набора данных они получат весь алфавит). Затем вы повторяете итерацию, чтобы найти все трехбуквенные подстроки, и так далее ...

4 голосов
/ 15 января 2010

Чтобы сравнить все строки в коллекции друг с другом, чтобы найти дубликаты, наиболее эффективно использовать Словарь:

string[] strings = { "Zaphod", "Trillian", "Zaphod", "Ford", "Arthur" };

var count = new Dictionary<string, int>();
foreach (string s in strings) {
  if (count.ContainsKey(s)) {
    count[s]++;
  } else {
    count.Add(s, 1);
  }
}
foreach (var item in count) {
  Console.WriteLine("{0} : {1}", item.Key, item.Value);
}

Выход:

Zaphod : 2
Trillian : 1
Ford : 1
Arthur : 1

Вы также можете сделать это, используя методы LINQ:

var count =
  strings
  .GroupBy(s => s)
  .Select(
    g => new { Key = g.First(), Value = g.Count() }
  );
0 голосов
/ 15 января 2010

Чтобы найти строки в вашем списке, которые находятся в списке несколько раз, вы можете начать помещать эти строки в HashSet и проверять каждую из них, находится ли она уже в этом наборе.

Например, вы могли бы:

HashSet<string> hashSet = new HashSet<string>();

foreach (string item in myList)
{
    if (hashSet.Contains(item)) 
    {
        // already in the list
        ...
    }
    else
    {
        // not seen yet, putting it into the hash set
        hashSet.Add(item);
    }
}
0 голосов
/ 15 января 2010

Мне нравится использовать статический метод String.Compare () , так как он позволяет вам сделать все явным. Это важно, поскольку сравнение строк может быть печально известным из-за незначительных ошибок.

Например:

// Populate with your strings
List<string> manyStrings = new List<string>();

string oneString="target string";

foreach(string current in manyStrings)
{
    // For a culture aware, safe comparison
    int compareResult=String.Compare(current,oneString,
                       StringComparison.CurrentCulture);
    // OR
    // For a higher performance comparison
    int compareResult=String.Compare(current,oneString,
                       StringComparison.Ordinal);

    if (compareResult==0) 
    {
        // Strings are equal 

    }
}

Если вы действительно хотите просто узнать, является ли строка подстрокой другой большей строки, в приведенном выше цикле вы можете использовать:

int indexPos=current.IndexOf(oneString,StringComparison.Ordinal); 

if (indexPos>=0)
{
    // oneString was found in current
}

Обратите внимание, что IndexOf принимает то же полезное перечисление StringComparison.

0 голосов
/ 15 января 2010

Если вы хотите сравнить, используйте String.Compare .
Если вы хотите найти строку в списке, используйте метод Contains / Select, эквивалентный типу списка.

0 голосов
/ 15 января 2010
 string[] comparisonList = {"a", "b" "c"};
 from s in comparisonList where comparisonList.Contains("b") select s;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...