Подтвердить что ты не робот

.net(С#) Сравнение двух списков строк и удаление несоответствующих элементов

Есть ли способ сравнить два списка строк (независимо от чувствительности к регистру) или мне нужно написать собственный код для такого сравнения? Я также хочу удалить несоответствующие элементы из моего словаря.

e.g

List<string> lst1 = new List<string>();
lst1.Add("value1");
lst1.Add("VALUE2");

List<string> lst2 = new List<string>();
lst2.Add("value1");
lst2.Add("value2");
lst2.Add("value3");

Теперь после сравнения я хочу иметь только "значение1" и "значение2" в lst2.

С уважением, JS

4b9b3361

Ответ 1

Вы можете использовать метод LINQ Intersect.

var result = lst1.Intersect(lst2, StringComparer.InvariantCultureIgnoreCase);

Вы можете избежать создания собственной реализации IEqualityComparer<string> с помощью StringComparer

Если вы хотите, чтобы результат был в lst2, сделайте это так:

lst2 = lst1.Intersect(lst2, StringComparer.InvariantCultureIgnoreCase).ToList();

Ответ 2

Вы можете использовать метод Enumerable.Intersect

Обратитесь к документации MSDN для примеров: http://msdn.microsoft.com/en-us/library/bb460136.aspx

Обратитесь к ответу Dyppl для реализации нечувствительного к регистру сравнения.

Ответ 3

Вы можете использовать метод расширения Intersect. Чтобы сделать это, вы можете использовать equaty comparer:

class Program
{
    static void Main(string[] args)
    {

        List<string> lst1 = new List<string>();
        List<string> lst2 = new List<string>();

        CaseInsensitiveEquityComparer comparer = new CaseInsensitiveEquityComparer();

        var result = lst1.Intersect(lst2, comparer);

    }
}

class CaseInsensitiveEquityComparer : IEqualityComparer<string>
{

    public bool Equals(string x, string y)
    {
        return String.Compare(x,y,true,CultureInfo.CurrentCulture) == 0;
    }

    public int GetHashCode(string obj)
    {
        return obj.GetHashCode();
    }
}