2009-10-07 4 views
18

Мне нужен регистр, не учитывающий регистр, или заданный тип коллекции (строк). Какой самый простой способ создать его? Вы можете указать тип сравнения, которое вы хотите получить на клавишах Словаря, но я не могу найти ничего похожего на список.Нечувствительный к регистру список

ответ

3

Похоже, его можно использовать класс KeyedCollection:

public class Set<T> : KeyedCollection<T,T> 
{ 
    public Set() 
    {} 

    public Set(IEqualityComparer<T> comparer) : base(comparer) 
    {} 

    public Set(IEnumerable<T> collection) 
    { 
     foreach (T elem in collection) 
     { 
      Add(elem); 
     } 
    } 

    protected override T GetKeyForItem(T item) 
    { 
     return item; 
    } 
} 
31

Предполагая, что вы используете .NET 3.5, вы можете просто использовать:

var strings = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase); 

... или что-то подобное, где вы бы выбрать настройку, а также соответствующей культуры.

Список не имеет понятия сравнения по большей части - только при вызове IndexOf и связанных с ним методах. Я не верю, что есть какой-то способ указать сравнение для этого. Однако вы можете использовать List<T>.Find с предикатом.

+1

Я застрял с .Net 2 sadly :( – Grzenio

2

Аналогичная история здесь, где хотите проверить contains

например

public static bool Contains(this string source, string toCheck, StringComparison comp) 
     { 
      return source.IndexOf(toCheck, comp) >= 0; 
     } 
20

Использование Linq, это добавляет новый метод .Compare

using System.Linq; 
using System.Collections.Generic; 

List<string> MyList = new List<string>(); 

MyList.Add(...) 

if (MyList.Contains(TestString, StringComparer.CurrentCultureIgnoreCase)) { 
    //found 
} 
+0

Вам не нужно использовать Linq для использования метода Contains –

+0

@ geo1701: но вам ** нужно ** 'using System.Linq', чтобы получить новую перегрузку с помощью' StringComparer'! –

+0

Спасибо, хороший ответ, я надеялся, что есть расширение, вместо того, чтобы писать мои собственные. В противном случае я бы не знал, где искать! – Abacus

0
var Addresses = Pr.Where(a = >a.Key.ToUpper() == "KEY VALUE").ToList(); 

Просто сделайте ключи в верхнем регистре и поиск ВЕРСИЛЬНОЕ ЗНАЧЕНИЕ

+0

Это ТОЧНО, что я хотел избежать. – Grzenio

Смежные вопросы