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

时间:2014-09-08 11:20:54

标签: c# linq

在我的c#app中,我有自定义对象列表:

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}

我的问题:我如何按参数id和方案排序我的第一个列表,如secondList中所述。
如果在secondList中遗漏了一些ID,请将firstList的相应项添加到结果列表的末尾。

多个OrderBy(...).ThenBy(...)的不幸解决方案无法帮助我。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

这将是:

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