关于List排序的问题

hdztroop 2019-11-12 04:56:08
建立了一个Person类型的List数据,想根据Age属性排序,排序只更改序号属性:
List<People> peoples = new List<People>()
{
new People() {age = 12, name="AAA", sex = "男", sn=1},
new People() {age=22, name = "BBB", sex = "男", sn=2},
new People() {age=13, name = "CCC", sex = "男", sn=3},
new People() {age = 31, name = "DDD", sex = "女", sn=4},
new People() {age=24, name = "EEE", sex = "女", sn=5},
new People() {age=54, name = "FFF", sex = "男", sn=6}
};
也就是说,排序完成后,对象实例在List中位置不变,只是sn的值根据排序发生变化。
以前没用过List排序,请各位指教一下如何实现
...全文
150 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
极客诗人 2019-11-14
  • 打赏
  • 举报
回复
引用 11 楼 hdztroop 的回复:
记得最后你还是要用peoples这个List集合,而不是tmpList
我试过了,可行,但是不明白tmplist有什么用?[/quote] tmpList 是排序后的集合
hdztroop 2019-11-14
  • 打赏
  • 举报
回复
感谢各位的解答,最终采用了@娃都会打酱油了 的方法,问题也得到了解答,谢谢各位!
毛毛虫的爱 2019-11-13
  • 打赏
  • 举报
回复
按1楼说的没问题,亲测可行!
hdztroop 2019-11-13
  • 打赏
  • 举报
回复
引用 1 楼 娃都会打酱油了 的回复:
你先orderby出一个新的集合,然后循环修改sn值就行了

var tmpList = peoples.OrderBy(x=>x.age).ToList();
for(var i=0;i< tmpList.Count;i++)
{
tmpList[i].sn = i+1;
}


记得最后你还是要用peoples这个List集合,而不是tmpList
我试过了,可行,但是不明白tmplist有什么用?
q107770540 2019-11-13
  • 打赏
  • 举报
回复
void Main()
{
	List<People> peoples = new List<People>()
	{
		new People() {age = 12, name="AAA", sex = "男", sn=1},
		new People() {age=22, name = "BBB", sex = "男", sn=2},
		new People() {age=13, name = "CCC", sex = "男", sn=3},
		new People() {age = 31, name = "DDD", sex = "女", sn=4},
		new People() {age=24, name = "EEE", sex = "女", sn=5},
		new People() {age=54, name = "FFF", sex = "男", sn=6}
 	};
	
	var query = peoples.OrderByDescending(p=>p.age)
					   .Select((p,i)=> new People
						{
						   age=p.age,
						   name=p.name,
						   sex=p.sex,
						   sn= i+1
						});
	 
	peoples = (from p in peoples
	          join q in query
			  on new {name = p.name, sex = p.sex} 
			  	 equals new { name = q.name, sex = q.sex}
			  select new People
			  {
			  			   age=p.age,
						   name=p.name,
						   sex=p.sex,
						   sn=q.sn
			  }).ToList();
 
}

public class People
{
  public int age {get; set;}
  public string name {get;set;}
  public string sex {get;set;}
  public int sn {get;set;}
}
xiaokaixinbao 2019-11-13
  • 打赏
  • 举报
回复
sn属性没必要,排序之后,直接通过下标访问就可以了 for(int i=0; i < peoples.Count();i ++){ //sn的值就相当于i+1;还节省点空间。 } sn是临时性的,真没必要成为对象属性。(我是从设计思路来的,有点跑题)
正怒月神 2019-11-13
  • 打赏
  • 举报
回复
但是,其实你这数据,直接select((x,i)=>{sn=i+1})也无所谓。
因为你sn好像根本无所谓前面有没有值。
正怒月神 2019-11-13
  • 打赏
  • 举报
回复
以上方法都可以, 主要纠结sn到底是你后来生成的,还是数据到手就是这样的。
极客诗人 2019-11-12
  • 打赏
  • 举报
回复
可以定义一个扩展字段 然后select 索引。
by_封爱 版主 2019-11-12
  • 打赏
  • 举报
回复
楼上可以实现.. 但是这样的话 你数据就跟原始数据不匹配了. 或者说 你这个sn只是用于"序号"操作? 那你完全不必要加这个字段.

list.select((item,index)=>
其中index就是索引.. 在返回的时候 加这个 就应该能满足你"序号"的操作
bloodish 2019-11-12
  • 打赏
  • 举报
回复

            peoples = peoples.OrderBy(p => p.age).ToList();
            var i = 0;
            peoples.ForEach(p => p.sn = ++i);
  • 打赏
  • 举报
回复
你先orderby出一个新的集合,然后循环修改sn值就行了

var tmpList = peoples.OrderBy(x=>x.age).ToList();
for(var i=0;i< tmpList.Count;i++)
{
tmpList[i].sn = i+1;
}


记得最后你还是要用peoples这个List集合,而不是tmpList

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧