Kthevar
Kthevar

Reputation: 1547

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

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

Upvotes: 9

Views: 32790

Answers (6)

Yissachar
Yissachar

Reputation: 71

You can use LINQ like this.

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

it's working only in .net 3 and above.

Upvotes: 0

TheVillageIdiot
TheVillageIdiot

Reputation: 40517

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

Upvotes: 2

Migol
Migol

Reputation: 8447

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.

Upvotes: 4

Rashmi Pandit
Rashmi Pandit

Reputation: 23828

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.

Upvotes: 3

itsmatt
itsmatt

Reputation: 31416

You could use LINQ. I haven't tested this, but I believe it'll filter down the elements of my list of pie fillings to show only those that start with a "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;

Upvotes: 0

Razzie
Razzie

Reputation: 31232

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.

Upvotes: 18

Related Questions