按另一个字符串列表对字符串列表进行排序

Joh*_*els 4 c# linq sorting

我有一个字符串列表,我希望按另一个字符串列表排序,如果列表中有不在比较器列表中的项目,我想要它们,因为它们位于列表的末尾.我怎样才能做到这一点?

所以,如果我有这个列表:List<string> {"A","T","G","F","V","E","W","Q" }
我有一个比较器:List<string> {"T","F","V","A" }
我希望结果是:List<string> {"T","F","V","A","G","E","W","Q" }

谢谢!

Hab*_*bib 6

看起来你需要使用IntersectExcept喜欢:

List<string> originalList = new List<string> {"A", "T", "G", "F", "V", "E", "W", "Q"};
List<string> compareList = new List<string> {"T", "F", "V", "A"};

var intersectedItems = compareList.Intersect(originalList);
var notIntersectedItems = originalList.Except(compareList);
var resultList = intersectedItems.Concat(notIntersectedItems).ToList();
Run Code Online (Sandbox Code Playgroud)

你会得到:

resultList = T,F,V,A,G,E,W,Q
Run Code Online (Sandbox Code Playgroud)


Tim*_*ter 6

如果它返回,您可以使用List<T>.IndexOf和使用:int.Maxvalue-1

List<string> result = list.OrderBy(str => {
    int index = comparer.IndexOf(str);
    return index == -1 ? int.MaxValue : index;
}).ToList();
Run Code Online (Sandbox Code Playgroud)

这是一个很长的版本,对某些人来说可能更具可读性.它也更灵活,因为您可以指定不包含项目的内容.例如,您可以按字典中加入命令他们ThenBy(x => x.String)面前Select(x => x.String):

List<string> result = list.Select(str => new
    {
        ComparerIndex = comparer.IndexOf(str),
        String = str
    })
    .OrderBy(x => x.ComparerIndex == -1 ? 1 : 0) // not contained -> at the end
    .ThenBy(x => x.ComparerIndex)
    .Select(x => x.String)
    .ToList();
Run Code Online (Sandbox Code Playgroud)