#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;
Некоторые другие методы завершаются неудачей, если последовательности не имеют одинаковой длины, но это всегда игнорирует любое несоответствие длины и сравнивает только существующие элементы, независимо от того, какая последовательность длиннее.