string[] listOne = new string[] { "dog", "cat", "car", "apple"};
string[] listTwo = new string[] { "car", "apple"};
我需要的是按listOne
中的项目顺序(如果有)订购listTwo
。所以新列表将按此顺序排列:
“汽车”,“苹果”,“狗”,“猫”
答案 0 :(得分:3)
您可以使用扩展方法 Union()
var result = listTwo.Union<string>(listOne);
答案 1 :(得分:3)
var result = listTwo.Union(listOne);
OR
var result =listTwo.Intersect(listOne).Concat(listOne.Except(listTwo));
var result = listTwo.Where(listOne.Contains).Concat(listOne.Except(listTwo));
发布的第一个答案有listTwo
项目订单的错误,请忽略以下答案
var result = listOne.OrderBy(i => !listTwo.Contains(i)).ToList();
结果
"car", "apple", "dog", "cat"
答案 2 :(得分:2)
var sub1 = listOne.Intersect(listTwo).ToList();
var sub2 = listOne.Except(listTwo);
sub1.AddRange(sub2);
答案 3 :(得分:2)
由于您使用的是数组,因此linq的大部分用法都会创建某种IEnumerable
的新实例,例如ToList
或ToArray
。
因此,我建议将Array.Sort
与Comparison一起使用:
string[] listOne=new string[] { "dog", "cat", "car", "apple" };
string[] listTwo=new string[] { "car", "apple" };
Comparison<String> comparison=
(x, y) => {
if(!listTwo.Contains(x)||!listTwo.Contains(y))
return 0;
else {
var indexOfX=Array.IndexOf(listTwo, x);
var indexOfY=Array.IndexOf(listTwo, y);
return indexOfX.CompareTo(indexOfY);
}
};
Array.Sort(listOne, comparison);
它会在内部按quick sort algorithm排序,它是in-place algorithm。
答案 4 :(得分:0)
这很有效,但我觉得可以做得更好:
var result=
from item in listOne
let existsInListTwo=listTwo.Contains(item)
let positionInListTwo=Array.IndexOf(listTwo, item)
orderby !existsInListTwo, positionInListTwo
select new {
Item=item,
position=positionInListTwo,
exists=existsInListTwo
};
编辑:结合使用此和Damith的方法,这更具可读性:
var result=
listOne.OrderBy(i => !listTwo.Contains(i))
.ThenBy(i => Array.IndexOf(listTwo, i))
.ToList();
答案 5 :(得分:0)
var result = listOne.Union(listTwo)
.Distinct()
.OrderBy(i => !listTwo.Contains(i));