C# List的用法 -如何用where进行筛选

List< T >定义

泛型集合

  1. 可以通过index访问的强类型对象列表
  2. 提供了搜索、排序、操作的方法
  3. T是列表元素的类型
namespace System.Collections.Generic
{
    //
    // Summary:
    //     Represents a strongly typed list of objects that can be accessed by index. Provides
    //     methods to search, sort, and manipulate lists.
    //
    // Type parameters:
    //   T:
    //     The type of elements in the list.
    [Serializable] //表明该类对象可以被序列化
    [DebuggerTypeProxy(typeof(Mscorlib_CollectionDebugView<>))]
    [DebuggerDisplay("Count = {Count}")]
    [__DynamicallyInvokable]
    public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IEnumerable, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>
    {
    public int Count                       //返回元素个数
    public T this[int index]               //通过index 访问
    public void Add(T item)                //添加元素
    public void Insert(int index, T item) //插入元素
    public void RemoveAt(int index)       //通过index删除
    public bool Remove(T item)            //删除
    public void Clear()                   //清空
    public bool Contains(T item)          // 查询是否包含某个对象
    IEnumerator IEnumerable.GetEnumerator() //通过List返回枚举器,
	public int IndexOf(T item)           //查询对象的inx值

Where作为关键字 -对list对象筛选

参考

1. 遍历列表 筛选满足条件的对象

var students = new List<Student>
{
    new Student("ShioriSaginomiya", "20210103", 16, Gender.Female),
    new Student("ShinonomeNano", "20120203", 1, Gender.Female),
    new Student("NoharaShinnosuke", "20200205", 15, Gender.Male),
    new Student("TomCat", "20200529", 19, Gender.Male),
    new Student("JerryMouse", "20210529", 19, Gender.Female),
    new Student("Enmu", "20190303", 2333, Gender.Male),
    new Student("Tohru", "20200101", 18, Gender.Female),
    new Student("KannaKamui", "20210101", 16, Gender.Female),
    new Student("HirasawaYui", "20150201", 28, Gender.Female),
    new Student("NakanoAzusa", "20160201", 26, Gender.Female)
}; 
var adults =
    from student in students
    where student.Age >= 18
    select student;
foreach (var student in students)
    if (student.Age >= 18)
        yield return student; 

2. 紧挨着的 where 从句,多个条件筛选

var student =
    from student in students
    where student.Age >= 18
    where student.Chinese + student.English + student.Math >= 180
    select student.Name; 

泛型集合

在C#中,非泛型集合主要指的是早期.NET框架中使用的集合类型,它们没有使用泛型参数来指定存储元素的类型。这些集合类型通常位于System.Collections命名空间中。以下是一些常见的非泛型集合类型:

  1. ArrayList:动态数组,可以存储任何类型的对象。
  2. Hashtable:键值对集合,使用哈希表实现,可以存储任何类型的键和值。
  3. Stack:后进先出(LIFO)的集合,用于实现堆栈数据结构。
  4. Queue:先进先出(FIFO)的集合,用于实现队列数据结构。
  5. SortedList:键值对集合,元素按照键排序存储。
  6. BitArray:位数组,可以存储布尔值,每个位可以独立设置为true或false。

这些非泛型集合类型在.NET 1.1及之前的版本中广泛使用,但随着.NET
2.0的发布,引入了泛型集合,它们提供了类型安全、性能提升以及更好的编译时检查。
泛型集合类型位于System.Collections.Generic命名空间,例如List<T>Dictionary<TKey, TValue>等。

尽管泛型集合提供了很多优势,但在某些情况下,非泛型集合仍然有其应用场景,比如当你需要存储不同类型的对象时。然而,通常推荐使用泛型集合,因为它们提供了更好的类型安全和性能。

Enumerable提供一系列静态方法,用于查询对象(实现了ystem.Collections.Generic.IEnumerable接口的对象)
而List刚好

System.Linq.Enumerable - Where定义

泛型集合是指通过传入参数类型T后再定义的集合
静态类Enumerable 提供一系列静态方法,用于查询对象(实现了ystem.Collections.Generic.IEnumerable接口的对象)
List实现了IEnumerable接口,所以可以调用下面的静态函数

在C#中,System.Linq.Enumerable 类提供了一组扩展方法,这些方法可以对实现了 IEnumerable<T> 接口的集合类型进行操作。这些方法使得你可以以声明性方式处理集合数据,而不需要编写复杂的循环代码。以下是一些常用的 Enumerable 静态函数及其作用:

namespace System.Linq

    public static class Enumerable
    {
//定义了一系列静态函数
  1. Where:过滤集合中的元素,返回满足条件的元素。

    var evenNumbers = numbers.Where(x => x % 2 == 0);
    
  2. Select:对集合中的每个元素应用一个转换函数,返回转换后的元素集合。

    var squares = numbers.Select(x => x * x);
    
  3. SelectMany:将集合中的每个元素展开成一个新的集合,并将所有集合合并为一个集合。

    var flattened = items.SelectMany(x => x.SubItems);
    
  4. OrderBy / OrderByDescending:对集合进行升序或降序排序。

    var sorted = people.OrderBy(x => x.Name);
    
  5. ThenBy / ThenByDescending:在现有排序基础上进一步排序。

    var sorted = people.OrderBy(x => x.Age).ThenBy(x => x.Name);
    
  6. GroupBy:将集合中的元素按指定键分组。

    var groups = people.GroupBy(x => x.Country);
    
  7. Aggregate:对集合中的元素进行累加操作,返回单一结果。

    int sum = numbers.Aggregate((a, b) => a + b);
    
  8. Count:返回集合中的元素数量。

    int count = numbers.Count();
    
  9. Any / All:检查集合中是否有任何元素满足条件或所有元素都满足条件。

    bool hasAny = numbers.Any();
    bool allEven = numbers.All(x => x % 2 == 0);
    
  10. Contains:检查集合中是否包含某个特定的元素。

    bool contains = numbers.Contains(5);
    
  11. DefaultIfEmpty:如果集合为空,则返回一个包含默认值的集合。

    var empty = numbers.DefaultIfEmpty(0);
    
  12. Distinct:返回集合中不重复的元素。

    var unique = numbers.Distinct();
    
  13. First / FirstOrDefault:返回集合中的第一个元素或默认值。

    var first = numbers.First();
    
  14. Last / LastOrDefault:返回集合中的最后一个元素或默认值。

    var last = numbers.Last();
    
  15. Single / SingleOrDefault:返回集合中唯一的元素或默认值。

    var single = numbers.Single();
    
  16. Skip / Take:跳过集合中的前N个元素或取集合中的前N个元素。

    var skipped = numbers.Skip(5);
    var taken = numbers.Take(3);
    

这些方法使得对集合进行查询和处理变得更加简洁和直观。使用LINQ(Language Integrated Query)可以极大地提高代码的可读性和维护性。

<think>好的,用户想在C#中了解如何使用List集合根据某个元素进行筛选,需要提供示例。首先,我需要回忆C#中处理集合筛选的方法,特别是使用LINQ的部分。 根据引用[5]提到的,C#Where方法可以用来筛选集合,结合Lambda表达式或者委托函数。例如,list.Where(item => item.Property == value)。这应该是最常用的方法。 然后,引用[3]和[4]都提到了LINQ的使用,比如Sum和筛选操作。用户可能需要基本示例,所以需要展示一个简单的Where用法,比如筛选年龄大于30的人。 另外,引用[3]中还有HashSet的例子,这可能和去重有关,但用户的问题是关于筛选,所以可能暂时不需要这部分内容。但如果有涉及筛选后去重的情况,可以提到Distinct方法,但用户的问题重点在筛选,所以可能放在后面的优化或高级用法里。 用户可能需要多种方法,除了Where,可能还有FindAll方法,因为List<T>本身有FindAll,它接受一个Predicate<T>委托。比如people.FindAll(p => p.Age > 30)。这也是一个可行的方法,不过FindAll返回的是List<T>,而Where返回的是IEnumerable<T>,这点可能需要说明区别。 引用[2]中的Java示例使用stream().filter,但在C#中对应的就是LINQ的Where,所以可以类比说明。 接下来,需要提供示例代码。比如创建一个Person类,有Name和Age属性,然后初始化一个List<Person>,用Where或FindAll筛选年龄大于30的人,并转换为列表。同时,需要注意是否需要立即执行,比如.ToList(),因为Where是延迟执行的。 另外,根据引用[5]中的例子,可以展示使用Lambda表达式和方法两种方式,这可能对用户有帮助,比如展示两种写法。 还需要考虑性能方面,比如多次筛选时如何优化,或者使用索引的情况,比如Where的重载带索引参数。不过用户的问题可能更基础,所以先提供基本方法,再在高级技巧里提到。 此外,引用[1]中提到了获取重复值,可能和筛选重复数据有关,但用户的问题是关于根据元素筛选,所以这部分可能暂时不相关,但可以作为相关问题中的一个问题,比如“如何筛选出重复项”。 最后,确保代码示例正确,比如正确使用Lambda语法,以及必要的using指令,比如using System.Linq;,因为LINQ需要这个命名空间。同时,提醒用户注意引用集合和类的定义。 总结,回答应包括: 1. 使用Where方法配合Lambda表达式。 2. 使用FindAll方法。 3. 多条件筛选。 4. 动态条件构建(如引用[5]中的方法委托)。 5. 示例代码和注意事项,比如立即执行和延迟加载的区别。 6. 性能优化和相关问题。</think>在C#中,使用List集合根据指定元素筛选数据主要有以下方法,结合LINQ和原生方法实现: --- ### 一、基础筛选方法 #### 1. 使用`Where`方法(LINQ) 通过Lambda表达式筛选符合条件的数据,返回`IEnumerable<T>`结果: ```csharp // 示例类 public class Person { public string Name { get; set; } public int Age { get; set; } } // 初始化数据 List<Person> people = new List<Person> { new Person { Name = "Alice", Age = 25 }, new Person { Name = "Bob", Age = 30 }, new Person { Name = "Charlie", Age = 35 } }; // 筛选年龄大于30岁的人 var filteredPeople = people.Where(p => p.Age > 30).ToList(); ``` #### 2. 使用`FindAll`方法(List原生) 直接作用于List集合,返回新的`List<T>`: ```csharp List<Person> result = people.FindAll(p => p.Age > 30); ``` --- ### 二、多条件筛选 通过逻辑运算符组合多个条件: ```csharp // 筛选年龄在25-35岁之间且名字以"C"开头的人 var query = people.Where(p => p.Age >= 25 && p.Age <= 35 && p.Name.StartsWith("C") ).ToList(); ``` --- ### 三、动态条件构建 通过方法委托实现复杂逻辑(引用[5]): ```csharp // 定义筛选方法 bool FilterByAgeAndName(Person p) { return p.Age > 30 && p.Name.Length > 3; } // 应用筛选 var dynamicResult = people.Where(FilterByAgeAndName).ToList(); ``` --- ### 四、性能优化技巧 1. **延迟执行**:`Where`方法默认返回延迟查询结果,直到调用`.ToList()`才实际执行[^4] 2. **索引筛选**:使用带索引的Where重载(如需要位置信息): ```csharp var indexedResults = people.Where((p, index) => index % 2 == 0 && p.Age > 25); ``` --- ### 五、完整代码示例 ```csharp using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { var products = new List<Product> { new Product { ID = 1, Category = "Electronics", Price = 599.99 }, new Product { ID = 2, Category = "Books", Price = 29.99 } }; // 筛选价格超过100的电子产品 var expensiveElectronics = products .Where(p => p.Category == "Electronics" && p.Price > 100) .ToList(); expensiveElectronics.ForEach(p => Console.WriteLine(p.ID)); } } public class Product { public int ID { get; set; } public string Category { get; set; } public double Price { get; set; } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值