C# > Advanced C# > LINQ > Filtering and Projection (where, select)
LINQ: Filtering and Projection with `Where` and `Select`
This snippet demonstrates how to use LINQ's `Where` and `Select` methods for filtering collections based on a condition and projecting the results into a new form. `Where` filters the elements, while `Select` transforms them.
Basic Example: Filtering and Projection
This code defines a `Product` class with properties for Name, Price, and Category. It creates a list of `Product` objects. Then, it uses LINQ to filter the list, selecting only products with a price greater than 100. After filtering, it projects the result, extracting only the `Name` property into a new sequence of strings. The result is then printed to the console.
using System;
using System.Collections.Generic;
using System.Linq;
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
public string Category { get; set; }
}
public class Example
{
public static void Main(string[] args)
{
List<Product> products = new List<Product>
{
new Product { Name = "Laptop", Price = 1200, Category = "Electronics" },
new Product { Name = "Keyboard", Price = 75, Category = "Electronics" },
new Product { Name = "T-Shirt", Price = 20, Category = "Clothing" },
new Product { Name = "Monitor", Price = 300, Category = "Electronics" },
new Product { Name = "Jeans", Price = 60, Category = "Clothing" }
};
// Filter products with price greater than 100 and select only their names
IEnumerable<string> expensiveProductNames = products
.Where(p => p.Price > 100)
.Select(p => p.Name);
Console.WriteLine("Expensive Product Names:");
foreach (string name in expensiveProductNames)
{
Console.WriteLine(name);
}
}
}
Concepts Behind the Snippet
LINQ (Language Integrated Query) provides a unified way to query data from various sources, including collections, databases, and XML. `Where` is a filtering operator that selects elements based on a given condition (a predicate function). `Select` is a projection operator that transforms each element into a new form. These operators can be chained together to perform complex data manipulation tasks.
Real-Life Use Case
Consider an e-commerce application. You might need to filter products based on various criteria (price range, category, availability) and then project the results to display only relevant information (product name, price, image URL) on a search results page. This snippet provides the basic building blocks for implementing such functionality efficiently.
Best Practices
Interview Tip
Be prepared to explain the difference between `Where` and `Select` in LINQ. Also, be ready to discuss how these operators contribute to writing more concise and readable code for data manipulation. Understanding deferred execution in LINQ is also critical.
When to Use Them
Use `Where` when you need to narrow down a collection based on certain criteria. Use `Select` when you need to transform the elements of a collection into a new form, extracting specific properties or creating new objects.
Memory Footprint
LINQ's `Where` and `Select` use deferred execution, meaning that the query is not executed until the results are iterated over. This can be beneficial for performance, as it avoids processing the entire collection upfront. However, it also means that the underlying collection must remain in memory for the duration of the query. If you need to materialize the results immediately, you can use methods like `ToList()` or `ToArray()`, but this will create a new collection in memory. Care should be taken when dealing with very large collections.
Alternatives
While LINQ is a powerful tool, you can also achieve filtering and projection using traditional `foreach` loops and conditional statements. However, LINQ often provides a more concise and readable syntax, especially for complex data manipulations. For very performance critical scenarios, carefully hand-crafted loops can sometimes provide slight performance gains at the expense of readability.
Pros
Cons
FAQ
-
What is the difference between `Where` and `Select`?
`Where` filters elements based on a condition, while `Select` transforms each element into a new form. -
What is deferred execution in LINQ?
Deferred execution means that a LINQ query is not executed until the results are iterated over. -
How can I materialize a LINQ query?
You can use methods like `ToList()` or `ToArray()` to materialize a LINQ query.