按参数和第二个列表中的位置排序列表

本文关键字:列表 位置 排序 第二个 参数 | 更新日期: 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(例如,47不够)

我的问题是:如何根据参数idsecondList中描述的场景对第一个列表进行排序
如果在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));