c#中List<T>find使用示例(转)

本文展示了如何利用C#的泛型集合(如List<T>)进行数据筛选、排序、查找等操作,包括寻找偶数整数、特定类型元素、计算整数总和、对订单进行排序及转换订单编号。通过实际代码示例,阐述了如何利用这些功能提升代码的效率和可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://blogs.msdn.com/b/kcwalina/archive/2004/06/22/162533.aspx

Generics and Anonymous Methods/Delegates

make up a powerful pair that can be used to create elegant query APIs. Here are some that we just added to the .NET Framework’s Collection libraries. I used List<T> to illustrate the APIs but most of those were also added to System.Array.

API Design

Delegates

namespace System {

   public delegate void Action<T>(T obj);

   public delegate bool Predicate<T>(T obj);

   public delegate U Converter<T,U>(T from);

   public delegate int Comparison<T>(T x, T y);

}

List<T>

public class List<T> : … {

   public int FindIndex(Predicate<T> match);

   public int FindIndex(int index, Predicate<T> match);

   public int FindIndex(int index, int count, Predicate<T> match);

   public int FindLastIndex(Predicate<T> match);

   public int FindLastIndex(int index, Predicate<T> match);

   public int FindLastIndex(int index, int count, Predicate<T> match);

 

   public List<T> FindAll(Predicate<T> match);

   public T Find(Predicate<T> match);

   public T FindLast(Predicate match);

   public bool Exists(Predicate<T> match);

   public bool TrueForAll(Predicate<T> match); 

   public int RemoveAll(Predicate<T> match);

   public void ForEach(Action<T> action);

   public void Sort(Comparison<T> comparison);

   public List<U> ConvertAll<U>(Converter<T,U> converter);

}

Finding Even Integers in List<T>

List<int> integers = new List<int>();

For(int i=1; i<=10; i++) integers.Add(i);

List<int> even = integers.FindAll(delegate(int i){

   return i%2==0;

});

Finding Complex Type in List<T>

public class Order {

   public Order(int number, string item) { … }

   public int Number { get { return number; } }

   public string Item { get { return item; } }

   …

}

List<Order> orders = new List<Order>();

int orderNumber = 10;

Order order = orders.Find(delegate(Order o){

   return o.Number==orderNumber;

});

Computing Sum of Integers in List<T>

List<int> integers = new List<int>();

for(int i=1; i<=10; i++) integers.Add(i);

int sum;

integers.ForEach(delegate(int i){ sum+=i; });

Sort Orders in List<T>

List<Order> orders = new List<Order>();

orders.Add(new Order(10,”Milk”));

orders.Add(new Order(5,”Cheese”));

 orders.Sort(delegate(Order x, Order y){

   return Comparer<int>.Default.Compare(x.Number,y.Number);

});

Convert Orders to Order Numbers

List<Order> orders = new List<Order>();

orders.Add(new Order(10,”Milk”));

orders.Add(new Order(5,”Cheese”));

List<int> numbers = orders.ConvertAll(delegate(Order x){

   return o.Number;

});

转自:http://www.dotblogs.com.tw/puma/archive/2009/05/28/asp.net-generic-list-sort-find-findall-exsit.aspx#12190

 

最近寫案子常常用到List<T>,這個東西還真好用

因為它有下列東西:

List<T>.Sort() → 排序T

List<T>.Find() → 找出一個T

List<T>.FindAll() →找出多個T

List<T>.Exist() →判斷T是否存在

小弟就寫個範例介紹這些東西吧..

GenericList.aspx

01<%@ Page Language="C#" AutoEventWireup="true" CodeFile="GenericList.aspx.cs" Inherits="GenericList" %>
02  
03<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
04  
05<html xmlns="http://www.w3.org/1999/xhtml">
06<head runat="server">
07    <title>GenericList</title>
08</head>
09<body>
10    <form id="form1" runat="server">
11    <div>
12        原始資料:
13        <asp:GridView ID="GridView1" runat="server">
14        </asp:GridView>
15    </div>
16    </form>
17</body>
18</html>

 

GenericList.aspx.cs

001using System;
002using System.Collections.Generic;
003using System.Web;
004using System.Web.UI;
005using System.Web.UI.WebControls;
006  
007public partial class GenericList : System.Web.UI.Page
008{
009  
010    protected void Page_Load(object sender, EventArgs e)
011    {
012        List<Person> lstPerson = new List<Person>();
013        lstPerson.Add(new Person(1, "puma", 10));
014        lstPerson.Add(new Person(2, "F6 Team", 20));
015        lstPerson.Add(new Person(3, "ASP.NET", 30));
016        lstPerson.Add(new Person(4, "Dotblogs", 40));
017  
018        //原始資料顯示在GridView上
019        this.GridView1.DataSource = lstPerson;
020        this.GridView1.DataBind();
021  
022  
023  
024        //List<T>.Find()
025        //找出Name='puma'的Person
026        Response.Write("找出Name='puma'的Person→ ");
027        Response.Write(lstPerson.Find(delegate(Person p) { return p.Name == "puma"; }).ToString() + "<p>");
028  
029  
030  
031        //List<T>.FindAll()
032        //找出Age>10的數目
033        Response.Write("找出Age>10的數目→ ");
034        Response.Write(lstPerson.FindAll(delegate(Person p) { return p.Age > 10; }).Count.ToString() + "<p>");
035  
036  
037  
038        //List<T>.Exists()
039        //檢查Name='F6'是否存在
040        Response.Write("檢查Name='F6'是否存在→ ");
041        Response.Write(lstPerson.Exists(delegate(Person p) { return p.Name == "F6"; }).ToString() + "<p>");
042  
043  
044  
045        //List<T>.Sort()
046        //依Name升冪排序
047        Response.Write("<p>依Name升冪排序↑<br/>");
048        lstPerson.Sort(delegate(Person p1, Person p2) { return Comparer<string>.Default.Compare(p1.Name, p2.Name); });
049        foreach (Person p in lstPerson)
050        {
051            Response.Write(p.ToString() + "<br/>");
052        }
053  
054  
055  
056        //List<T>.Sort()
057        //依Name降冪排序
058        Response.Write("<p>依Name降冪排序↓<br/>");
059        lstPerson.Sort(delegate(Person p1, Person p2) { return Comparer<string>.Default.Compare(p2.Name, p1.Name); });
060        foreach (Person p in lstPerson)
061        {
062            Response.Write(p.ToString() + "<br/>");
063        }
064    }
065}
066  
067public class Person
068{
069    private int _ID;
070    private string _Name;
071    private int _Age;
072  
073    public Person(int ID, string Name, int Age)
074    {
075        _ID = ID;
076        _Name = Name;
077        _Age = Age;
078    }
079  
080    public int ID
081    {
082        set { _ID = value; }
083        get { return _ID; }
084    }
085  
086    public string Name
087    {
088        set { _Name = value; }
089        get { return _Name; }
090    }
091  
092    public int Age
093    {
094        set { _Age = value; }
095        get { return _Age; }
096    }
097  
098    public override string ToString()
099    {
100        return string.Format("ID:{0},Name:{1},Age:{2}", _ID, _Name, _Age);
101    }
102}

 

執行結果:

 转自微软官方:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace Find
{
    class Program
    {
        private static string IDtoFind = "bk109";

        private static List<Book> Books = new List<Book>();
        public static void Main(string[] args)
        {
            FillList();

            // Find a book by its ID.
            Book result = Books.Find(
            delegate(Book bk)
            {
                return bk.ID == IDtoFind;
            }
            );
            if (result != null)
            {
                DisplayResult(result, "Find by ID: " + IDtoFind);
            }
            else
            {
                Console.WriteLine("\nNot found: {0}", IDtoFind);
            }


            // Find last book in collection published before 2001.
            result = Books.FindLast(
            delegate(Book bk)
            {
                DateTime year2001 = new DateTime(2001, 01, 01);
                return bk.Publish_date < year2001;
            });
            if (result != null)
            {
                DisplayResult(result, "Last book in collection published before 2001:");
            }
            else
            {
                Console.WriteLine("\nNot found: {0}", IDtoFind);
            }


            // Find all computer books.
            List<Book> results = Books.FindAll(FindComputer);
            if (results != null)
            {
                DisplayResults(results, "All computer:");
            }
            else
            {
                Console.WriteLine("\nNo books found.");
            }

            // Find all books under $10.00.
            results = Books.FindAll(
            delegate(Book bk)
            {
                return bk.Price < 10.00;
            }
            );
            if (results != null)
            {
                DisplayResults(results, "Books under $10:");
            }
            else
            {
                Console.WriteLine("\nNo books found.");
            }


            // Find index values.
            Console.WriteLine();
            int ndx = Books.FindIndex(FindComputer);
            Console.WriteLine("Index of first computer book: {0}", ndx);
            ndx = Books.FindLastIndex(FindComputer);
            Console.WriteLine("Index of last computer book: {0}", ndx);

            int mid = Books.Count / 2;
            ndx = Books.FindIndex(mid, mid, FindComputer);
            Console.WriteLine("Index of first computer book in the second half of the collection: {0}", ndx);

            ndx = Books.FindLastIndex(Books.Count - 1, mid, FindComputer);
            Console.WriteLine("Index of last computer book in the second half of the collection: {0}", ndx);

        }

 

 

        // Populates the list with sample data.
        private static void FillList()
        {

            // Create XML elements from a source file.
            XElement xTree = XElement.Load(@"c:\temp\books.xml");

            // Create an enumerable collection of the elements.
            IEnumerable<XElement> elements = xTree.Elements();

            // Evaluate each element and set set values in the book object.
            foreach (XElement el in elements)
            {
                Book book = new Book();
                book.ID = el.Attribute("id").Value;
                IEnumerable<XElement> props = el.Elements();
                foreach (XElement p in props)
                {


                    if (p.Name.ToString().ToLower() == "author")
                    {
                        book.Author = p.Value;
                    }
                    else if (p.Name.ToString().ToLower() == "title")
                    {
                        book.Title = p.Value;
                    }
                    else if (p.Name.ToString().ToLower() == "genre")
                    {
                        book.Genre = p.Value;
                    }
                    else if (p.Name.ToString().ToLower() == "price")
                    {
                        book.Price = Convert.ToDouble(p.Value);
                    }
                    else if (p.Name.ToString().ToLower() == "publish_date")
                    {
                        book.Publish_date = Convert.ToDateTime(p.Value);
                    }
                    else if (p.Name.ToString().ToLower() == "description")
                    {
                        book.Description = p.Value;
                    }
                }

                Books.Add(book);

            }

            DisplayResults(Books, "All books:");

        }

        // Explicit predicate delegate.
        private static bool FindComputer(Book bk)
        {

            if (bk.Genre == "Computer")
            {
                return true;
            }
            {
                return false;
            }

        }

        private static void DisplayResult(Book result, string title)
        {
            Console.WriteLine();
            Console.WriteLine(title);
            Console.WriteLine("\n{0}\t{1}\t{2}\t{3}\t{4}\t{5}", result.ID,
                result.Author, result.Title, result.Genre, result.Price,
                result.Publish_date.ToShortDateString());
            Console.WriteLine();


        }

        private static void DisplayResults(List<Book> results, string title)
        {
            Console.WriteLine();
            Console.WriteLine(title);
            foreach (Book b in results)
            {

                Console.Write("\n{0}\t{1}\t{2}\t{3}\t{4}\t{5}", b.ID,
                    b.Author, b.Title, b.Genre, b.Price,
                    b.Publish_date.ToShortDateString());
            }
            Console.WriteLine();

        }

    }

    public class Book
    {
        public string ID { get; set; }
        public string Author { get; set; }
        public string Title { get; set; }
        public string Genre { get; set; }
        public double Price { get; set; }
        public DateTime Publish_date { get; set; }
        public string Description { get; set; }
    }
}
<think>首先,用户的问题是:“我想了解C#中List<T>.ToList()使用方法 请问C# List<T>.ToList()方法的使用示例和说明”。这是一个关于C#编程的问题,具体涉及List<T>的ToList()方法。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式,但在这个上下文中,可能不需要数学表达式,因为这是编程问题。所以,我应该避免使用数学表达式,除非必要。 - 独立公式必须使用$$...$$格式并单独成段,同样,可能不适用。 - LaTeX语法正确:确保任何代码或特殊格式正确。 - 使用中文回答:整个回答必须用中文。 - 生成相关问题:在回答结束后,生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识:例如[^1]。用户提供了几个引用,我需要参考它们。用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。”但在这个对话中,这是第一个问题,所以没有上一次的问题。用户提供的引用是关于C#的List<T>的Add、FindAll、Where、OrderBy等方法,但用户当前的问题是针对ToList()方法。 用户提供的引用: - [^1]: 关于List<T>.Add(T),链接到优快云博客。 - [^2]: List<T>.FindAll和LINQ Where方法的比较。 - [^3]: List<T>.Find使用示例。 - [^4]: List<T>排序总结。 用户的问题是关于List<T>.ToList()的,所以我需要解释这个方法。ToList()是一个LINQ扩展方法,用于将任何IEnumerable<T>换为List<T>。它位于System.Linq命名空间下。 关键点: - ToList()方法创建一个新的List<T>对象,包含源序列中的所有元素。 - 它常用于将查询结果或其他IEnumerable换为列表,以便使用列表特有的方法,如索引访问。 示例: 在C#中,你可以这样使用: ```csharp List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; // 使用LINQ查询 var evenNumbers = numbers.Where(n => n % 2 == 0).ToList(); ``` 这里,Where返回一个IEnumerable<int>,然后ToList()将其换为List<int>。 用户提供的引用中提到了一些相关方法: - [^2]讨论了FindAll和Where,其中Where返回IEnumerable<T>,通常需要ToList()换为列表。 - [^4]讨论了排序,其中OrderBy返回IOrderedEnumerable<T>,然后使用ToList()换为列表。 所以,在回答中,我可以自然地引用这些。例如,在解释ToList()时,提到它与Where或OrderBy结合使用。 回答结构: - 清晰、逐步解决问题。 - 使用中文。 - 包括示例代码。 - 在末尾添加引用标识,如果引用了提供的内容。 最后,生成相关问题。 大纲回答: 1. 介绍ToList()方法:解释它是什么,作用是什么。 2. 使用场景:为什么需要它,常见用途。 3. 示例代码:给出一个或多个示例。 4. 注意事项:比如性能考虑(它会创建新列表)。 5. 参考引用:如果适用,添加引用标识。 6. 生成相关问题。 引用:用户提供了引用[^2]和[^4],这与ToList()相关,因为Where和OrderBy通常与ToList()一起使用。所以,在解释时可以提到。 例如: "在LINQ查询中,如Where方法返回一个IEnumerable<T>,我们可以使用ToList()来将其换为List<T>以便进一步操作[^2]。" 类似地,对于排序:"在排序操作中,OrderBy返回IOrderedEnumerable<T>,调用ToList()可以获取一个列表[^4]。" 现在,构建回答。</think>### C# 中 List<T>.ToList() 方法的使用说明和示例C# 中,`List<T>.ToList()` 是一个 LINQ 扩展方法(位于 `System.Linq` 命名空间下),用于将任何实现了 `IEnumerable<T>` 接口的集合(如数组、列表或查询结果)换为一个新的 `List<T>` 对象。这个方法不会修改原始集合,而是创建一个包含所有元素的新列表。这在需要列表特有功能(如索引访问、添加/删除元素)或确保数据独立性时非常有用。下面我将逐步解释其用法,并提供详细示例。 #### 1. **方法定义和作用** - `ToList()` 方法签名:`public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)` - **参数**:`source` 是源集合,必须是 `IEnumerable<T>` 类型。 - **返回值**:返回一个新的 `List<T>`,包含源集合中的所有元素。 - **关键特性**: - **创建新对象**:每次调用都会生成一个独立的列表副本,对副本的修改不影响原始集合。 - **性能考虑**:如果源集合已经是 `List<T>`,`ToList()` 会直接返回一个新列表(浅拷贝),时间复杂度为 O(n),n 是元素数量。避免在大型集合中频繁使用以防内存开销。 - **常用场景**:与 LINQ 查询(如 `Where`、`OrderBy`)结合使用,将查询结果换为可操作的列表[^2][^4]。 #### 2. **基本使用示例** 以下是一个简单示例,展示如何将数组或查询结果换为 `List<T>`: ```csharp using System; using System.Collections.Generic; using System.Linq; // 必须引入 LINQ 命名空间 class Program { static void Main() { // 示例 1: 将数组换为 List<T> int[] numbersArray = { 1, 2, 3, 4, 5 }; List<int> numbersList = numbersArray.ToList(); Console.WriteLine("换后的列表: " + string.Join(", ", numbersList)); // 输出: 1, 2, 3, 4, 5 // 示例 2: 结合 LINQ 查询使用 var evenNumbers = numbersArray.Where(n => n % 2 == 0).ToList(); Console.WriteLine("偶数列表: " + string.Join(", ", evenNumbers)); // 输出: 2, 4 } } ``` - **说明**:在示例 1 中,`numbersArray.ToList()` 将整型数组换为 `List<int>`。在示例 2 中,`Where` 方法过滤出偶数(返回 `IEnumerable<int>`),然后 `ToList()` 将其换为列表。这确保了 `evenNumbers` 是一个独立的列表对象。 #### 3. **高级用法:与排序和筛选结合** `ToList()` 常用于处理动态查询结果。例如,结合排序方法(如 `OrderBy`)或筛选方法(如 `FindAll`): ```csharp using System; using System.Collections.Generic; using System.Linq; class Student { public string Name { get; set; } public int Score { get; set; } } class Program { static void Main() { List<Student> students = new List<Student> { new Student { Name = "Alice", Score = 85 }, new Student { Name = "Bob", Score = 90 }, new Student { Name = "Charlie", Score = 75 } }; // 示例 1: 使用 OrderBy 排序后换为列表 var sortedStudents = students.OrderBy(s => s.Score).ToList(); Console.WriteLine("按分数排序后的列表:"); foreach (var s in sortedStudents) Console.WriteLine($"{s.Name}: {s.Score}"); // 输出: Charlie:75, Alice:85, Bob:90 // 示例 2: 结合 FindAll 筛选(返回 List<T>,无需额外 ToList()) var highScorers = students.FindAll(s => s.Score >= 85); Console.WriteLine("高分学生列表:"); foreach (var s in highScorers) Console.WriteLine($"{s.Name}: {s.Score}"); // 输出: Alice:85, Bob:90 } } ``` - **说明**: - 在排序示例中,`OrderBy` 返回 `IOrderedEnumerable<Student>`,调用 `ToList()` 后得到一个可修改的列表[^4]。 - `FindAll` 方法本身返回 `List<T>`,因此不需要额外调用 `ToList()`[^2]。这体现了 `ToList()` 在非列表查询结果中的必要性。 #### 4. **注意事项** - **内存管理**:`ToList()` 会创建新对象,适用于需要隔离数据副本的场景。如果只需遍历元素,直接使用 `IEnumerable<T>` 更高效。 - **错误处理**:如果源集合为 `null`,调用 `ToList()` 会抛出 `ArgumentNullException`。建议先检查 null。 - **与数组换对比**:`ToArray()` 方法类似,但返回数组而非列表。选择取决于是否需要列表的动态大小特性。 - **引用类型处理**:`ToList()` 执行浅拷贝。如果元素是引用类型(如类对象),修改副本中的对象会影响原始集合。 #### 5. **总结** `List<T>.ToList()` 是 C# 中处理集合换的关键方法,特别适合与 LINQ 查询集成。它提供数据隔离和灵活性,但需注意性能开销。在实际开发中,结合 `Where`、`OrderBy` 等方法使用,可以高效地处理数据筛选和排序任务[^2][^4]。 如果您有更多具体场景(如处理大型数据集或异步操作),我可以提供进一步优化建议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值