Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按另一个字符串列表对字符串列表进行排序_C#_Linq_Sorting - Fatal编程技术网

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

C# 按另一个字符串列表对字符串列表进行排序,c#,linq,sorting,C#,Linq,Sorting,我有一个字符串列表,我想按另一个字符串列表排序,如果列表中有项目不在比较器列表中,我希望它们位于列表的末尾。我该怎么做 所以如果我有这个列表:列表{“A”,“T”,“G”,“F”,“V”,“E”,“W”,“Q”} 我有一个比较器:列表{“T”,“F”,“V”,“a”} 我希望结果是:列表{“T”、“F”、“V”、“A”、“G”、“E”、“W”、“Q”} 谢谢 看起来您需要使用Intersect和,除了类似以下内容之外: List<string> originalList = new

我有一个字符串列表,我想按另一个字符串列表排序,如果列表中有项目不在比较器列表中,我希望它们位于列表的末尾。我该怎么做

所以如果我有这个列表:
列表{“A”,“T”,“G”,“F”,“V”,“E”,“W”,“Q”}

我有一个比较器:
列表{“T”,“F”,“V”,“a”}

我希望结果是:
列表{“T”、“F”、“V”、“A”、“G”、“E”、“W”、“Q”}


谢谢

看起来您需要使用
Intersect
,除了类似以下内容之外:

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();
如果返回
-1
,则可以使用
List.IndexOf
int.Maxvalue

List<string> result = list.OrderBy(str => {
    int index = comparer.IndexOf(str);
    return index == -1 ? int.MaxValue : index;
}).ToList();
这应该做到:

var a = new List<string> {"A","T","G","F","V","E","W","Q" };
var b = new List<string> {"T","F","V","A"};

var res = b.Concat(a.Except(b));
var a=新列表{“a”、“T”、“G”、“F”、“V”、“E”、“W”、“Q”};
var b=新列表{“T”、“F”、“V”、“A”};
var res=b.Concat(a.除(b)外);
列表输入=新列表{“A”、“T”、“G”、“F”、“V”、“E”、“W”、“Q”};
列表输入1=新列表{“T”、“F”、“V”、“A”};
var res=input.Union(input1.OrderBy(c=>c.ToList();

因此,如果字符串不在比较器中,则此排序返回到原始顺序?请看这里将相交保留并对重复项进行排序?相交和除外,两者都将删除重复项。我更喜欢此答案,因为它更具可读性,至少对我来说是这样。虽然其他的也很好。我不认为这回答了问题的答案,这个答案给出了b中的所有元素,但我相信问题是要求将b中包含的a元素放在新列表的开头。换句话说,b可以有a中不存在的元素,b只是排序元素
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();
var a = new List<string> {"A","T","G","F","V","E","W","Q" };
var b = new List<string> {"T","F","V","A"};

var res = b.Concat(a.Except(b));
List<string> input = new List<string> { "A", "T", "G", "F", "V", "E", "W", "Q" };
List<string> input1 = new List<string> { "T", "F", "V", "A" };
var res = input.Union(input1).OrderBy(c => c).ToList();