C# List的使用

 

正文

一、List排序

采用自定义Sort比较器和Linq

复制代码
class Persion
    {
        public string name;
        public int age;
}
//自定义Sort方法
private static void sortListClass()
        {
            Persion p1 = new Persion() { name = "huyong", age = 27 };
            Persion p2 = new Persion() { name = "tansha", age = 25 };
            List<Persion> listPersion = new List<Persion>();
            listPersion.Add(p1);
            listPersion.Add(p2);
            listPersion.Sort(sortage);
            foreach (var item in listPersion)
            {
                Console.WriteLine(item.name + ":" + item.age);
            }
        }
        static int sortage(Persion x, Persion y)
        {
            if (x.age < y.age) return -1;                //按age从大到小 降序排列
            else if (x.age == y.age) return 0;
            else return 1;
        }
//linq方法
 private static void sortLinq()
        {
            Persion p1 = new Persion() { name = "huyong", age = 27 };
            Persion p2 = new Persion() { name = "tansha", age = 25 };
            Persion p3 = new Persion() { name = "tansha", age = 27 };
            List<Persion> listPersion = new List<Persion>();
            listPersion.Add(p1);
            listPersion.Add(p2);
            listPersion.Add(p3);

 var lList = from t in listPersion where (t.age == 27) orderby t.name ascending select t;
            foreach (var item in lList)
            {
                Console.WriteLine(item.name + ":" + item.age);
            }
        }
//或者
listPersion =listPersion.OrderBy(p=>p.name).ToList();
View Code
复制代码

采用Linq的OderBy排序时,

若集合的个数为0,也不会报错;

OderBy排序的结果需要重新赋值给list集合。

二、用Linq将两个Model的list合并为一个list

1、两个Model的属性不相同

复制代码
  //linq合并两个list,根据某一相同字段
private static void mergeList()
        {
            Persion p1 = new Persion() { name = "hy", province = "jx" };
            Persion p2 = new Persion() { name = "tansha", province = "hn" };
            Persion p3 = new Persion() { name = "ht", province = "gd" };
            List<Persion> listPersion = new List<Persion>();
            listPersion.Add(p1);
            listPersion.Add(p2);
            listPersion.Add(p3);

            Persion p11 = new Persion() { name = "hy", age = 23, sex = "" };
            Persion p21 = new Persion() { name = "tansha", age = 12, sex = "" };
            Persion p31 = new Persion() { name = "ht", age = 7, sex = "" };
            List<Persion> listPersion2 = new List<Persion>();
            listPersion2.Add(p11);
            listPersion2.Add(p21);
            listPersion2.Add(p31);

            //linq合并两个list,根据某一相同字段
            var list = from pp1 in listPersion
                       join pp2 in listPersion2 on pp1.name equals pp2.name
                       select new Persion
                       {
                           name = pp1.name,
                           province = pp1.province,
                           age = pp2.age,
                           sex = pp2.sex
                       };
            foreach (var item in list)
            {
                Console.WriteLine(item.name + ":" + item.age + ":" + item.sex + ":" + item.province);
            }
        }
View Code
复制代码

2、两个对象model 之间取差集、交集、并集

复制代码
 public class TerminalModel
 {
       public string Code{get;set;}
       public string Name{get;set;}
 
 }
     
    public class CompareTerminalModel : IEqualityComparer<TerminalModel>
    {
 
        public bool Equals(TerminalModel x, TerminalModel y)
        {
            return x.Code == y.Code;
        }
 
        public int GetHashCode(TerminalModel p)
        {
            if (p == null)
                return 0;
            return p.Code.GetHashCode();
        }
 
 
    }
 
3. 取集
List<TerminalModel>  list = new List<TerminalModel>();
List<TerminalModel>  list2 = new List<TerminalModel>();
 
var chaji = list.Except(list2,new CompareTerminalModel()).ToList(); //差集
var jiaoJi = list.Intersect(list2,new CompareTerminalModel()).ToList();  //交集
var bingJi = list.Union(list2,new CompareTerminalModel()).ToList();  //并集
 
 
View Code
复制代码

其中,并集Union,若结果中想用某个list的字段,则其list写在Union的前面

三、List里面的某个数据进行操作并保存

lists.Where(q =>q.SellChannelId == ((int)SellChannelType.PB).ToString()).ToList().ForEach(q => q.index = 10);

四、List<T>转化为IQueryable<T>

  不能直接转换,

IQueryable在数据库端中查询,

IEnumerable在内存上查询。

List<T>支持后者。可以用 list.AsQueryable<T>转换。

五、使用LINQ从List<T>集合中删除指定集合元素

实体类(Author):

public class Author{
    public int id{get;set;}
   public string firstname{get;set;}
   public string lastname {get;set;}
}

比如有如下的LINQ查询语句:

var authors = from x in authorsList
              select x;

其中,需要从查询集合中删除 firstname=’Bob’ 的所有用户,应该如何实现呢?

方案一:

authorsList = authorsList.Where(x => x.FirstName != "Bob").ToList();
//或者
authorsList.RemoveAll(x => x.firstname == "Bob");

方案二:

复制代码
var authorsList = new List<Author>()
{
    new Author{ Firstname = "Bob", Lastname = "Smith" },
    new Author{ Firstname = "Fred", Lastname = "Jones" },
    new Author{ Firstname = "Brian", Lastname = "Brains" },
    new Author{ Firstname = "Billy", Lastname = "TheKid" }
};

var authors = authorsList.Where(a => a.Firstname == "Bob");
authorsList = authorsList.Except(authors).ToList();
authorsList = authorsList.Except(authorsList.Where(a=>a.Firstname=="Billy")).ToList();
 
复制代码

六、快速创建一个连续数字的List

var numberList = Enumerable.Range(1, 100).ToList();


posted @   peterYong  阅读(21591)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示