Как переопределить метод Except в List?

327
15 марта 2017, 15:39

Есть два списка

var lst1 = new List<string> { "cat", "dog"};
var lst2 = new List<string> { "catty", "dogs"};
var rez = lst1.Except(lst2);

На данный момент я с помощью метода Except получаю нужные мне данные. Теперь понадобилось сравнивать данные по толерантности. Например, слово dog и dogy на процентов 80 идентичны. Для этого я использую расстояние Левенштейна. Как переопределить метод Except для этого?

static class LevenshteinDistance
    {
        /// <summary>
        /// Compute the distance between two strings.
        /// </summary>
        public static int Compute(string s, string t)
        {
            int n = s.Length;
            int m = t.Length;
            int[,] d = new int[n + 1, m + 1];
            // Step 1
            if (n == 0)
            {
                return m;
            }
            if (m == 0)
            {
                return n;
            }
            // Step 2
            for (int i = 0; i <= n; d[i, 0] = i++)
            {
            }
            for (int j = 0; j <= m; d[0, j] = j++)
            {
            }
            // Step 3
            for (int i = 1; i <= n; i++)
            {
                //Step 4
                for (int j = 1; j <= m; j++)
                {
                    // Step 5
                    int cost = (t[j - 1] == s[i - 1]) ? 0 : 1;
                    // Step 6
                    d[i, j] = Math.Min(
                        Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1),
                        d[i - 1, j - 1] + cost);
                }
            }
            // Step 7
            return d[n, m];
        }
    }
Answer 1

Напишите новый метод. Поскольку класс List<T> — класс фреймворка, можно сделать лишь метод расширения (extension), или статический метод другого класса с двумя аргументами.

Существующий метод переопределить нельзя. Если бы это было можно, то все методы фреймворка, которые используют его, внезапно стали бы работать по другому — а это привело бы к печальным последствиям.

Пример:

List<string> ExceptByLev(List<string> minuend, List<string> subtrahend, double threshold) =>
    minuend.Where(m => subtrahend.All(s => LevenshteinDistance.Compute(m, s) > threshold))
           .ToList();

Обратите внимание, что ваше «равенство» нетранзитивно. Это значит, что результат может зависеть от того, как именно производятся вычисления. В частности, если у вас есть два «равных» элемента, третий элемент может быть «равен» одному и «не равен» другому.

READ ALSO
Сжатие Deflate(GZIP)

Сжатие Deflate(GZIP)

Информация доступна крупицами, а вопрос большойТак как не силён в английском - http://www

279
Готов ли ASP.NET Core MVC для продакшена?

Готов ли ASP.NET Core MVC для продакшена?

Здравствуйте, вопрос к тем, кто уже работал с платформой ASPNET Core MVC

339
Как очистить IEnumerable

Как очистить IEnumerable

Здравствуйте!

274