Поиск списка элементов в списке - PullRequest
1 голос
/ 01 февраля 2011

Изначально у меня есть следующий код.

var list = new Dictionary<string, int>();
list.Add("abcd", 1);
list.Add("abc", 12);
list.Add("def", 14);

// Найти элементы в этом списке просто.

var results = list.Where(p => p.Value.Equals("abc"));

А вот и мой вопрос.

Если у меня есть список поисковых слов, как искать эти элементы в списке. Я не хочу использовать для цикла для этого. Есть ли встроенная функциональность или мне нужно написать метод расширения?

List<string> searchList = new List<string>();
searchList.Add("abc") ;
searchList.Add("def") ;

Найти все предметы в searchList в list

Ответы [ 2 ]

3 голосов
/ 01 февраля 2011

Вы можете использовать IEqualityComparer интерфейс:

public class EqualityComparer : IEqualityComparer<string>
{

    public bool Equals(string x, string y)
    {
        return y.Contains(x);
    }

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

Тогда используйте его:

        HashSet<string> searchList = new HashSet<string>();
        searchList.Add("abc");
        searchList.Add("def");

        var list = new Dictionary<string, int>();
        list.Add("abcd", 1);
        list.Add("abc", 12);
        list.Add("def abc", 14);
        list.Add("test test", 15);

        var lst = list.Where(p => searchList.Contains(p.Key, new EqualityComparer()));

Как @Ani сказал, что это равенство не хорошо, вы можететакже выполните:

var lst1 = list.Where(p => searchList.Any(x => p.Key.Contains(x)));

Просто добавьте нулевые проверки самостоятельно.

1 голос
/ 01 февраля 2011

Я бы порекомендовал использовать HashSet для вашего searchList, а затем сделать что-то вроде этого:

HashSet<string> searchList = new HashSet<string>();
searchList.Add("abc");
searchList.Add("def");

var list = new Dictionary<string, int>();
list.Add("abcd", 1);
list.Add("abc", 12);
list.Add("def", 14);

list.Where(p => searchList.Contains(p.Key));

Это предотвратит операцию O (n) в searchList для каждого выполнения предложения Where в качествепоиск должен быть близок к O (1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...