.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
Ответы
Ответ 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();
}
}