【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(); 

 

posted @ 2021-09-27 16:26  不溯流光  阅读(1137)  评论(0编辑  收藏  举报