按参数和第二个列表中的位置排序列表
本文关键字:列表 位置 排序 第二个 参数 | 更新日期: 2023-09-27 18:20:58
在我的c#应用程序中,我有一个自定义对象列表:
obj a,b,c,d,i,f,j
a.id = 1;
b.id = 2;
c.id = 3;
d.id = 4;
i.id = 5;
f.id = 6;
j.id = 7;
var firstList = new List<obj> {a,b,c,d,i,f,j};
我有int
的的第二个列表
var secondList = new List<int> {5,6,2,1,3};
secondList
中的项目-这是来自firstList
的id,按特定顺序排列。此列表不能包括来自firstList
的所有id(例如,4
和7
不够)
我的问题是:如何根据参数id
和secondList
中描述的场景对第一个列表进行排序
如果在secondList
中遗漏了一些ID,则将firstList
的相应项目添加到结果列表的末尾。
不幸的是,多个OrderBy(...).ThenBy(...)
的解决方案对我没有帮助。
var firstListDic = firstList.ToDictionary(o => o.id);
var secondListSet = new HashSet<int>(secondList);
var result = secondList.Select(i => firstListDic[i])
.Concat(firstList.Where(o => !secondListSet.Contains(o.id)))
.ToList();
应该是:
secondList.Union(firstList.Select(o => o.id))
.Select(o => firstList.FirstOrDefault(k => k.id == o))
.ToList();
如果obj类包含类似的内容
class obj
{
public int id;
public override string ToString()
{
return id.ToString();
}
}
然后你可以测试这个
var firstList = new List<int> { 1, 2, 3, 4, 5, 6, 7 }
.Select(o => new obj() {id = o}).ToList();
var secondList = new List<int> { 5, 6, 2, 1, 3 };
var thirdlist =
secondList
.Union(firstList.Select(o => o.id))
.Select(o => firstList.FirstOrDefault(k => k.id == o))
.ToList();
Console.WriteLine(string.Join(",",thirdlist));