【C#】List使用汇总
一、将List复制到另一个List
1、值类型的List
List<T> newList = oldList.GetRange(index, count);
或者
List<T> newList = new List<T>(oldList);
2、引用类型的List(深度复制)
利用System.Xml.Serialization来实现序列化与反序列化:
https://blog.csdn.net/keneyr/article/details/114359307
using System; using System.Collections.Generic; using System.Collections ; using System.Linq; using System.Text; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; namespace LINQ { [Serializable] public class tt { private string name = ""; public string Name { get { return name; } set { name = value; } } private string sex = ""; public string Sex { get { return sex; } set { sex = value; } } } class LINQTest { //利用 System.Runtime.Serialization序列化与反序列化完成引用对象的复制 //实现List单个元素的复制 public static T Clone<T>(T RealObject) { using (Stream objectStream = new MemoryStream()) { IFormatter formatter = new BinaryFormatter(); formatter.Serialize(objectStream, RealObject); objectStream.Seek(0, SeekOrigin.Begin); return (T)formatter.Deserialize(objectStream); } } //实现整个List的复制 public static List<T> Clone<T>(object RealObject) { using (Stream objectStream = new MemoryStream()) { IFormatter formatter = new BinaryFormatter(); formatter.Serialize(objectStream, RealObject); objectStream.Seek(0, SeekOrigin.Begin); return formatter.Deserialize(objectStream) as List<T>; } } public static void Main() { List<tt> lsttt = new List<tt>(); tt tt1 = new tt(); tt1.Name = "a1"; tt1.Sex = "20"; lsttt.Add(tt1); List<tt> l333 = new List<tt>(); l333.Add(Clone<tt>(lsttt[0])); // l333 = Clone<tt>(lsttt);//整个List复制 l333[0].Name = "333333333"; } } }
二、批量对List的某个字段赋值
listName.ForEach(a => a.b = false);
三、截取List
dataList = dataList.GetRange(firstIndex, 10); //截取firstIndex开始往后十个元素
四、List转换为数组
String[] str=list.ToArray();
五、排序
1、按大小排序
NumList.Sort((x, y) => x.CompareTo(y)); //升序
NumList.Sort((x, y) => -x.CompareTo(y)); //降序
2、按日期字符串字段进行排序
(1)排序一个嵌套List
public class Class1 { public string time { get; set; } public List<Class2> subList { get; set; } } public class Class2 { public string time { get; set; } }
List<Class1> list = new List<Class1>(); Class1 tmplist = new Class1(); tmplist.subList = new List<Class2>(); ////添加数据//// //排序 嵌套List for (int i = 0; i < list.Count; i++) { var orderedList1 = list[i].subList.OrderBy(x => DateTime.ParseExact(x.time, "HH-mm-ss", System.Globalization.CultureInfo.InvariantCulture)).ToList(); list[i].subList = orderedList1; }
(2)排序一个简单日期字符串List
List s = new List() { "01/01/2013", "10/01/2013", "20/01/2013" }; var d = s.OrderByDescending(i => DateTime.ParseExact(i, "dd/MM/yyyy", null));
注意:字符串格式一定要符合DateTime.ParseExact中定义的时间格式,否则转换会出错。
例如,定义格式"HH-mm-ss",字符串就一定不能是“01:02:03”或“01-02-3”,必须为“01-02-03”。
参考:https://cloud.tencent.com/developer/ask/sof/243016
六、字符串List去重
(1)值类型
NumList = NumList.Distinct().ToList();
(2)引用类型
//需要继承IEqualityComparer,先判断第一个字段,如果有重复再做对比。 public class CustomerComparer : IEqualityComparer<Customer> { public bool Equals(Customer x, Customer y) { if (x == null) return y == null; return x.id == y.id && x.name == y.name && x.age == y.age && x.email == y.email; } public int GetHashCode(Customer obj) { if (obj == null) return 0; return obj.id.GetHashCode(); } }
参考:https://blog.csdn.net/aa2528877987/article/details/128749565
七、List使用foreach循环操作出现“集合已修改;可能无法执行枚举操作”错误
解决方法:
不要在枚举集合的操作(例如foreach)中去执行修改集合的操作。如果需要修改集合,那么应该先使用 ToArray() 方法。
foreach(var row in list.ToArray()) { 执行修改list的操作。 }
八、在List里查找近似值
int firstIndex = dataList.Select((d, i) => { return new { Value = d, Index = i }; }).OrderBy(x => Math.Abs(x.Value - tempdata)).First().Index; //获取与tempdata最相近相近的第一个索引
九、List内容为引用类型时,按某个条件查找最大值,并返回对象
List<Object> tmpObjs = new List<Object>(); max_Obj = tmpObjs.OrderByDescending(item => item.bbb).First();
多个判断条件时:
Object temp = tmpObjs.Find(t => t.aaa == "" && t.bbb > 30 && t.ccc == true);
https://www.codenong.com/1101841/
十、判断字段是否存在
if(List.Exists(t => t.aaa == "")) { }
十一、var到List<T>转换
var selected = from s in studentCollection select s; List<Student> selectedCollection = selected.ToList();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!