Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Filter List<> object without using foreach loop in C#2.0

Tags:

c#

c#-2.0

How we can filter the object in List<> in C#?

like image 986
Kthevar Avatar asked May 22 '09 11:05

Kthevar


4 Answers

Let's say we have a List<string> and you want only the items where the length of the string is greater than 5.

The code below will return a List<string> with the results:

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 will containt 'world!' and 'large!!'. This example uses an anonymous method. It can also be written as:

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

//..

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

The delegate above, OnlyLargerThanFive, is also called a Predicate.

like image 151
Razzie Avatar answered Oct 24 '22 01:10

Razzie


The best solution is to use lambda:

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

It may use internally foreach, but you can't really filter without iterating for whole list.

like image 39
Migol Avatar answered Oct 24 '22 00:10

Migol


List<>.Find (gives the first matching occurence) and List.FindAll() gives all matching occurences. An example with a list of complex types would is as follow:

I have a class Report:

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

and a list of Report

List<Report> reportList;

To find items in the list where ReportName = 'MyReport', the code would be:

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

To get the first report:

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

Note that the object passed to the delegate should be of the type with which the list is populated.

like image 21
SO User Avatar answered Oct 24 '22 00:10

SO User


besides the way told by @Razzie you can also use 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:- IS ONLY POSSIBLE IN .NET 3 and above

like image 27
TheVillageIdiot Avatar answered Oct 23 '22 23:10

TheVillageIdiot