Поиск подходящего списка в словаре

public class Filter
{
    public List<int> A { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
}
var f1 = new Filter(){A = new List<int>() {1}}
var f2 = new Filter(){A = new List<int>() {1 , 4, 2}, Start = DateTime.Now, End = DateTime.AddHour(2)}

var dict = new Dictionary<Filter, string>()
dict.Add(new Filter(){A = new List<int>() {1}}, "asdf");
dict.Add(new Filter(){A = new List<int>() {4}}, "qwerty");
dict.Add(new Filter(){A = new List<int>() {3}}, "qwertyasd");

Мне нужно получить:

с f1 пункт первый

с f2 предметы первого и второго.

Как построить запрос linq?

когда A является int, Это просто

dict.Where(k =>
k.Key.A.Equals(filter.A)
&& k.Key.Start.CompareTo(filter.Start) > 0 
&& k.Key.End.CompareTo(filter.End) < 0
)

но когда это List<int> это сложнее для меня.

3 ответа

Решение

Просто используйте Содержит и инвертировать управление

dict.Where(k =>
    filter.A.Contains(k.Key.A[0]) //CONTAINS !
    && k.Key.Start.CompareTo(filter.Start) > 0 
    && k.Key.Start.CompareTo(filter.End) < 0
)

Вы можете использовать метод пересечения

dict.Where(k =>
            k.Key.A.Intersect(filter.A).Any()
            && k.Key.Start.CompareTo(filter.Start) > 0
            && k.Key.End.CompareTo(filter.End) < 0
        );

Редактировать: Добавлено Intersect так как есть два списка.

Если хотя бы один элемент Filter.A должен соответствовать одному элементу dict.Key.A, вы также можете сделать это.

Потому что я не вижу интереса иметь список... только для одного int!

var result = dict.Where(k =>
                           filter.A.Intersect(k.Key.A).Any());
Другие вопросы по тегам