linq : найти значения в списке существуют в другом списке или нет?

#c# #.net #linq

#c# #.net #linq

Вопрос:

У меня небольшая проблема, из приведенного ниже кода сначала мы находим хостельстопы с идентификатором, именем хостеля, временем, затем мы берем wardenkduty с именем службы, tasksStart

теперь я хочу проверить, существует ли hostelStops-Имя хоста в списке задач-taskStart

 var hostelStops =   (from item in Hostel.Where(tn =gt; tn.HostelNumber == hostelNumber).SelectMany(x =gt; x.Hostels)  select new  {  Id = item.Id,  hostelName = hostelName.Single(p =gt; p.Id == item.hostelId).SymbolicName,  InTime = item.InTimeTime   }).ToList();  var taskList =   (from row in filteredWardenDuty  select new  {  dutyName = row.DutyName,  taskStart = row.WardenTasks.Select(x =gt; x.Context.Start.PlaceId)  }).ToList();   

итак, я написал ниже код

 var isExist =   from row in taskList  select new  {  task = row.taskStart.Contains((from item in hostelStops select item.hostelName ))  };  

но, получив ошибку как

Ошибка CS1929 «IEnumerable» не содержит определения для «Содержит», а лучший метод расширения перегружает » Расширения памяти.Содержитlt;IEnumerablegt;(ReadOnlySpanlt;IEnumerablegt;lt;IEnumerablegt;, IEnumerable)’ требуется приемник типа » ReadOnlySpanlt;IEnumerablegt;lt;IEnumerablegt;»

Комментарии:

1. не могли бы вы, пожалуйста, отредактировать свой вопрос относительно фрагментов кода. Это не совсем читабельно. Может быть, ты скучаешь using System.Linq; …?

2. спасибо за ответ, но система. Linq существует в верхней части файла класса

3. вы уверены, что у вас есть список с именем stops ? разве так не должно быть hostelStops ?

4. на самом деле в списке задач присутствуют значения hostelStops, но во время разработки мы получили эту ошибку

Ответ №1:

Вы не можете этого сделать someCollection.Contains(otherCollection) , вы должны это сделать someCollection.Any(item =gt; otherCollection.Contains(item)) (по-английски: «содержится ли какой-либо предмет из этой коллекции в этой коллекции»), поэтому что-то вроде:

 row.taskStart.Any(ts =gt; (from item in hostelStops select item.hostelName).Contains(ts));  

Возможно, было бы более эффективно превратить ваши хост-магазины в хэш-набор:

 var hs = (from item in hostelStops select item.hostelName).ToHashSet(); ... row.taskStart.Any(ts =gt; hs.Contains(ts));  

Вам не было ясно, какие это типы; это будет работать только в том случае, если две коллекции имеют один и тот же базовый тип (например, string) или тип, который можно правильно сравнивать, даже если это разные экземпляры, для которых вам, возможно, придется написать пользовательский компаратор или пару переопределений Equals/GetHashCode