Поиск подходящего списка в словаре
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());