整理一下List<T>的常用方法

本文回顾了在.NET Framework 3.5之前的环境中,使用List<T>进行数据操作的多种方法,包括查找、排序、分页等,特别针对没有Linq和lambda表达式的限制下,如何利用委托和匿名方法实现数据处理。

前段时间一个项目用的是VS2005开发的,没有Linq没有lambda表达式,所以狠狠的把List<T>的一些方法用了一遍,现整理一下。
1. 在泛型集合中查询符合条件的第一条数据

1 private static string IDtoFind = "bk109";
2 private static List<Book> Books = new List<Book>();
3 Book result = Books.Find(
4             delegate(Book bk)
5             {
6                 return bk.ID == IDtoFind;
7             }
8             );

其中Find的参数是一个委托,用来指向一个指定查询方式的方法,为省事直接写个匿名方法即可,当然。NET Framework 3.5 以上的话可以用lambda表达式。
2. 搜索与指定条件相匹配的元素,并返回整个 List<T> 中的最后一个匹配元素。与Find()类似。

1 result = Books.FindLast(
2             delegate(Book bk)
3             {
4                 DateTime year2001 = new DateTime(2001,01,01);
5                 return bk.Publish_date < year2001;
6             });

3. 检索与指定谓词定义的条件匹配的所有元素,这次返回的是符合条件的元素的List<T>

List<Book> results = Books.FindAll(FindComputer);

4. 实现升序或降序的排列

1 class Pet
2 {
3     public string Name { get; set; }
4     public int Age { get; set; }
5 }
 1 List<Pet> pets =new List<Pet>() { new Pet { Name="Barley", Age=8 },
 2                new Pet { Name="Boots", Age=4 },
 3                new Pet { Name="Whiskers", Age=1 } };
 4 //升序
 5 IEnumerable<Pet> query = pets.OrderBy(
 6             delegate (Pet pet)
 7             {return pet.Age}
 8             );
 9 //降序
10 IEnumerable<Pet> query = pets.OrderByDescending(
11             delegate (Pet pet)
12             {return pet.Age}
13             );

5. 实现伪分页

IEnumerable<Pet> query=pets.Skip(2).Take(1);

Skip的意思是跳过前面的数量,Take的意思是获取的数量。

转载于:https://www.cnblogs.com/headwolf/archive/2013/06/14/3135670.html

【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器状态空间平均模型的建模策略。该方法通过对系统中多个相互耦合的DC-DC变换器进行统一建模,构建出整个微电网的集中状态空间模型,并在此基础上实施线性化处理,便于后续的小信号分析与稳定性研究。文中详细阐述了建模过程中的关键步骤,包括电路拓扑分析、状态变量选取、平均化处理以及雅可比矩阵的推导,最终通过Matlab代码实现模型仿真验证,展示了该方法在动态响应分析和控制器设计中的有效性。; 适合人群:具备电力电子、自动控制理论基础,熟悉Matlab/Simulink仿真工具,从事微电网、新能源系统建模与控制研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网中多变换器系统的统一建模方法;②理解状态空间平均法在非线性电力电子系统中的应用;③实现系统线性化并用于稳定性分析与控制器设计;④通过Matlab代码复现和扩展模型,服务于科研仿真与教学实践。; 阅读建议:建议读者结合Matlab代码逐步理解建模流程,重点关注状态变量的选择与平均化处理的数学推导,同时可尝试修改系统参数或拓扑结构以加深对模型通用性和适应性的理解。
<think>好的,我现在需要帮助用户了解如何在C#中自定义List<T>的Sort方法的比较器,特别是实现IComparer接口。首先,我得回忆一下C#中排序的相关知识。用户提到了引用中的内容,所以应该结合这些引用信息来组织答案。 首先,用户的问题是关于实现IComparer<T>接口来自定义Sort方法。根据引用[1]和[4],IComparer可以和List<T>.Sort一起使用。引用[4]还提到应该从Comparer<T>类派生,而不是直接实现接口,这可能是一个需要注意的点。 然后,我需要分步骤说明实现方法。首先,可能需要创建一个实现IComparer<T>接口的类,或者使用Comparer<T>的派生类。引用[2]中的例子使用了IComparable<T>,但用户的问题是关于IComparer的,所以应该区分这两者。IComparable是对象自身实现的,而IComparer是外部比较器。 接下来,示例代码是关键。根据引用[2]和[4],可能需要展示如何定义一个比较器类,并实现Compare方法。比如,定义一个Person类,然后创建一个AgeComparer,实现IComparer<Person>,然后在Sort方法中使用这个比较器。 另外,引用[3]提到List.Sort(IComparer<T>)是不稳定排序,这点需要提醒用户注意,可能建议使用其他方法如OrderBy,或者在比较器中添加次要条件来保持稳定性。 还需要考虑比较器的重用,如引用[1]提到的,可以创建多个比较器用于不同的排序需求。比如按年龄或姓名排序的不同比较器。 最后,生成相关问题的时候,可能需要包括性能、稳定性、比较器与IComparable的区别,以及如何实现降序排序等问题。 现在整理步骤: 1. 实现IComparer<T>接口的类:需要定义类,并实现Compare方法,返回-1、0、1。 2. 使用Comparer<T>.Create方法(可能更简便的方式,但需要确认是否适用)。 3. 在Sort方法中传入比较器实例。 4. 注意事项:稳定性问题,建议添加次要排序条件;建议从Comparer<T>派生。 可能还需要比较使用IComparer和IComparable的区别,但用户的问题明确是关于IComparer的,所以重点在此。 检查引用中的示例,如引用[2]中的Person类实现了IComparable<T>,而这里需要的是IComparer<T>的例子,所以应该另外写一个比较器类,比如AgeComparer,然后在Sort时传入。 另外,引用[4]提到StringComparer和默认实现,可能可以举例说明字符串的比较器使用,但用户的问题是关于自定义的,所以可能以自定义类为例更好。 现在,组织回答结构: - 分步说明如何实现IComparer<T> - 示例代码 - 注意事项(稳定性,重用,派生自Comparer<T>) - 相关问题 需要确保LaTeX格式正确,比如变量用$...$,独立公式用$$...$$,但问题中可能涉及代码较多,数学公式可能较少,但如果有的话需要注意格式。 最后,确保引用的正确添加,引用[1]、[3]、[4]的相关内容在适当的位置标注。</think>在C#中自定义$List<T>$的$Sort$方法比较器主要通过实现$IComparer<T>$接口实现。以下是具体实现方式和注意事项: ### 分步实现方法 1. **定义比较器类** 创建实现$IComparer<T>$接口的类,重写$Compare$方法: ```csharp public class AgeComparer : IComparer<Person> { public int Compare(Person x, Person y) { if (x == null) return y == null ? 0 : -1; if (y == null) return 1; return x.Age.CompareTo(y.Age); } } ``` 2. **使用比较器排序** 调用$List<T>.Sort$方法时传入比较器实例: ```csharp List<Person> people = GetPeople(); people.Sort(new AgeComparer()); ``` 3. **Lambda表达式简化**(C# 3.0+) 通过$Comparer<T>.Create$生成比较器: ```csharp people.Sort(Comparer<Person>.Create((a, b) => a.Name.CompareTo(b.Name))); ``` ### 关键注意事项 1. **稳定性问题** $List<T>.Sort$默认使用**不稳定排序**,相等元素的原始顺序可能改变[^3]。如需稳定排序,可改用$OrderBy$: ```csharp var sorted = people.OrderBy(p => p.Age).ToList(); ``` 2. **比较器复用** 建议将常用比较器设计为静态单例: ```csharp public static class PersonComparers { public static IComparer<Person> Age => new AgeComparer(); } people.Sort(PersonComparers.Age); ``` 3. **继承建议** 推荐从$Comparer<T>$基类派生,而非直接实现接口[^4]: ```csharp public class NameComparer : Comparer<Person> { public override int Compare(Person x, Person y) => x.Name.CompareTo(y.Name); } ``` ### 性能对比 | 方法 | 时间复杂度 | 稳定性 | 代码简洁性 | |------|------------|--------|------------| | $IComparer$ | $O(n \log n)$ | 不稳定 | 中等 | | $OrderBy$ | $O(n \log n)$ | 稳定 | 高 | | $IComparable$ | $O(n \log n)$ | 不稳定 | 高[^2] |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值