Фильтр объекта List> без использования цикла foreach в C # 2.0 - PullRequest
9 голосов
/ 22 мая 2009

Как мы можем отфильтровать объект в List <> в C #?

Ответы [ 6 ]

18 голосов
/ 22 мая 2009

Допустим, у нас есть List<string>, и вам нужны только элементы, длина строки которых больше 5.

Приведенный ниже код вернет List<string> с результатами:

List<string> myList = new List<string>();
myList.Add("hello");
myList.Add("world!");
myList.Add("one");
myList.Add("large!!");
List<string> resultList = myList.FindAll(delegate(string s) { return s.Length > 5; });

resultList будет содержать 'world!' и "большой !!" В этом примере используется анонимный метод . Это также может быть записано как:

List<string> myList = new List<string>();
// ..
List<string> resultList = myList.FindAll(OnlyLargerThanFive);

//..

private static bool OnlyLargerThanFive(string s)
{
  return s.Length > 5;
}

Делегат выше, OnlyLargerThanFive, также называется Predicate .

4 голосов
/ 22 мая 2009

Лучшее решение - использовать лямбду:

List<Item> l;
l.FindAll(n => n.Something == SomethingElse);

Он может использовать foreach для внутреннего использования, но вы не можете действительно фильтровать без итерации для всего списка.

3 голосов
/ 22 мая 2009

List <>. Find (дает первое совпадение), а List.FindAll () - все совпадения. Пример со списком сложных типов выглядит следующим образом:

У меня есть отчет класса:

public class Report
{
    public string ReportName;
    public ReportColumnList ReportColumnList;
}

и список отчетов

List<Report> reportList;

Чтобы найти элементы в списке, где ReportName = 'MyReport', код будет:

string reportName = "MyReport";
List<Report> myReports = reportList.FindAll(delegate(Report obj) { return obj.ReportName == reportName; });

Чтобы получить первый отчет:

Report rc = reportList.Find(delegate(Report obj) { return obj.ReportName == reportName; });

Обратите внимание, что объект, передаваемый делегату, должен иметь тип , которым заполнен список .

2 голосов
/ 22 мая 2009

помимо того, что сказал @ Razzie , вы также можете использовать LINQ .

List<string> myList = new List<string>();
myList.Add("hello");
myList.Add("world!");
myList.Add("one");
myList.Add("large!!");

var filtered=from s in myList where s.Length > 5 select s;

PS: - ВОЗМОЖНО ТОЛЬКО В .NET 3 и выше

0 голосов
/ 14 августа 2013

Вы можете использовать LINQ , как это.

List<string> List = new List<string> { "i", "am", "using", "LINQ!" }; List<string> result = myList.Where(s => s.Length > 3).ToList();

работает только в .net 3 и выше.

0 голосов
/ 22 мая 2009

Вы можете использовать LINQ . Я не проверял это, но я верю, что он отфильтрует элементы моего списка начинки пирога, чтобы показать только те, которые начинаются с "P":

List<string> list = new List<string>();

list.Add("Apple");
list.Add("Peach");
list.Add("Chocolate");
list.Add("Pear");
list.Add("Pumpkin");
list.Add("Cherry");
list.Add("Coconut");


var filteredOnes = from item in list
                   where item.StartsWith("P")
                   select item;
...