Оператор LINQ Distinct, игнорируйте регистр?

90
задан Ash 24 January 2010 в 08:57
поделиться

3 ответа

StringComparer делает то, в чем Вы нуждаетесь:

List<string> list = new List<string>() {
    "One", "Two", "Three", "three", "Four", "Five" };

var distinctList = list.Distinct(
    StringComparer.CurrentCultureIgnoreCase).ToList();

(или инвариант / порядковый / и т.д. в зависимости от данных Вы выдерживаете сравнение)

212
ответ дан Marc Gravell 24 November 2019 в 06:59
поделиться

[Посмотрите, что Marc Gravells отвечает, хотите ли Вы самый краткий подход]

После некоторого расследования и хорошей обратной связи от Bradley Grainger, я реализовал следующий IEqualityComparer. Это поддерживает нечувствительный к регистру оператор Distinct () (просто передают экземпляр этого к оператору Distinct):

class IgnoreCaseComparer : IEqualityComparer<string>
{
    public CaseInsensitiveComparer myComparer;

    public IgnoreCaseComparer()
    {
        myComparer = CaseInsensitiveComparer.DefaultInvariant;
    }

    public IgnoreCaseComparer(CultureInfo myCulture)
    {
        myComparer = new CaseInsensitiveComparer(myCulture);
    }

    #region IEqualityComparer<string> Members

    public bool Equals(string x, string y)
    {
        if (myComparer.Compare(x, y) == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

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

    #endregion
}
5
ответ дан Dave New 24 November 2019 в 06:59
поделиться

Вот намного более простая версия.

List<string> list = new List<string>() { "One", "Two", "Three", "three", "Four", "Five" };

var z = (from x in list select new { item = x.ToLower()}).Distinct();

z.Dump();
0
ответ дан Brandon 24 November 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: