Найти исключения в зубчатом массиве строк (C #) - PullRequest
0 голосов
/ 29 июня 2011

У меня есть некоторые данные, которые я прочитал в неровный массив строк.Пример таких массивов:

string[] row = { "John", "Apple", "Orange", "Banana" };

, и у меня будет массив для хранения этих строк строк.Очень длинный.

Я хочу найти все строки с одинаковыми именами (" Джон ").Затем сравните эти строки, чтобы увидеть, идентичны ли они.Напечатайте все из них, если есть какие-либо исключения, в противном случае переходите к следующему имени.

Так, например, если у меня есть 10 строк " John ", я хочу проверить, есть ли атрибуты навсе 10 из них - это ровно « Apple », « Orange » и « Banana ».И у меня будут тысячи имен, отличных от « Джон », с которыми я хочу сделать то же самое.

Существует ли эффективный алгоритм для этого?Я буду писать это на C #.

1 Ответ

0 голосов
/ 29 июня 2011

Используя Linq, вы можете сделать следующее:

var rows = new string[][]
{
    new string[] {"John", "Apple", "Orange", "Banana"},
    new string[] {"John", "Apple", "Orange", "Banana"},
    new string[] {"John", "Apple", "Lemon", "Banana"},
    new string[] {"John", "Apple", "Orange", "Grape"},
    new string[] {"Sam", "Apple", "Orange", "Banana"},
    new string[] {"Sam", "Apple", "Orange", "Banana"},
};

var results = (from f in rows
              where f.Contains("Sam")
              select f).Distinct(new ArrayComparer());

Однако для этого необходимо создать специальный класс сравнения следующим образом:

class ArrayComparer : IEqualityComparer<string[]>
{
    public bool Equals(string[] x, string[] y)
    {
        if (x.Length != y.Length)
            return false;

        var left = x.OrderBy(s => s).ToArray();
        var right = y.OrderBy(s => s).ToArray();

        for (int index = 0; index < x.Length; index++)
        {
            if (left[index] == right[index])
            {
                continue;
            }
            else
            {
                return false;
            }
        }

        return true;
    }

    public int GetHashCode(string[] obj)
    {
        int hash = 23;
        foreach (var element in obj.OrderBy(s => s))
        {
            hash = hash * 37 + element.GetHashCode();
        }

        return hash;
    }
}

Результат использования Джона будет 3 строки, а результаты с Сэмом будут 2 строки. Если вы хотите игнорировать регистр, вам просто нужно изменить OrderBy(s => s) на OrderBy(s => s, StringComparer.OrdinalIgnoreCase)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...