создайте какой-то цикл внутри запроса linq

#c# #linq

#c# #linq

Вопрос:

У меня есть метод, который я хочу использовать для фильтрации listview. Я создаю listview динамически, поэтому заранее не знаю количество столбцов. lstCurrentDynamicItems — это класс только с одним свойством, и это свойство называется c, а его тип — object[] . Я создал этот класс для хранения объектов listview. Если бы у меня всегда был один и тот же listview, тогда у меня не было бы проблем с созданием следующего метода. Как я мог бы реализовать следующий метод?

 public void filterListView(string[] columnsContains)
        {
            // lstCurrentDynamicItems is a list of objects
            // columnsContains is what I want to filter.             
            var qr = from a in lstCurrentDynamicItems
                     where a.c[0].ToString().Contains(columnsContains[0]) amp;amp;
                           a.c[1].ToString().Contains(columnsContains[1]) amp;amp;
                           a.c[2].ToString().Contains(columnsContains[2]) amp;amp;
                           //    ...
                           //    ...
                           //    ...
                           a.c[columnsContains.Length].ToString().Contains(columnsContains[columnsContains.Length])                            
                    select a;

            listView.DataContext = qr;
        }
  

Ответ №1:

Что-то вроде этого должно сработать:

 var qr = 
from a in lstCurrentDynamicItems
where Enumerable.Range(0,columnsContains.Length)
                .All(i => a.c[i].ToString().Contains(columnsContains[i]))
select a;
  

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

1. @Tono Nam: конечно, вы должны убедиться, что a.c.Length всегда равно (или больше) columnsContains.Length

Ответ №2:

 var qr = from a in lstCurrentDynamicItems
         where a.c.Select((item, index) => new { item, index }).
                   All(o => o.item.ToString().Contains(columnsContains[o.index]))
         select a;
  

Разница между этим и ответом @digEmAll заключается в том, что его решение завершится неудачей, если в columnContains нем будет больше элементов, чем в c коллекции, в то время как это решение, с другой стороны, завершится неудачей, если в columnContains нем будет меньше элементов, чем в c коллекции.

Ответ №3:

Это идеальное использование для Enumerable.Zip

 var qr = from a in lstCurrentDynamicItems
   where c
      .Zip(columnsContains, (a, b) => a.ToString().Contains(b))
      .All(p => p)
   select a;
  

Некоторые другие методы завершаются неудачей, если последовательности не имеют одинаковой длины, но это всегда игнорирует любое несоответствие длины и сравнивает только существующие элементы, независимо от того, какая последовательность длиннее.