我有两个字符数组列表:
char[] charA = new char[] { 'a', 'd', 'd', 'b', 'y', 'c', 'a' };
char[] charB = new char[] { 'a', 'b', 'c', 'd'};
现在我希望获得所有相同的元素并获得与第二个列表相同的排列(排列是a,b,c,d ):
var final = charA.Where(x => charB.Any(y => y == x)).ToArray();
结果是:
'a', 'd', 'd', 'b', 'c', 'a'
但我想要的是使用LINQ在第二个列表上的排列:
'a', 'a', 'b', 'c', 'd', 'd'
答案 0 :(得分:3)
实现它的一种方法是从第二个数组中选择并加入第一个数组:
var result = from b in charB
join a in charA on b equals a into c
from a in c
select a;
您还可以将charA
加入charB
并使用收到项目索引的Select
重载来实现:
var result = from a in charA
join b in charB.Select((item, index) => new { item, index }) on a equals b.item
orderby b.index
select a;
关于您的实施的一点说明:请参阅您可以使用Contains
代替Any
:
charA.Where(x => charB.Contains(x))
答案 1 :(得分:0)
使用方法语法:
char[] charA = new char[] { 'a', 'd', 'd', 'b', 'y', 'c', 'a' };
char[] charB = new char[] { 'a', 'b', 'c', 'd' };
var result = charA.Where(x => charB.Contains(x)).OrderBy(x => Array.IndexOf(charB, x));
首先,Where
用于过滤掉charB
以外的值。如果没有这个,charB
以外的元素最终会出现在result
的开头。然后,使用Array.IndexOf
简单地对剩余集合进行排序,charA
返回charB
中echo gzencode(json_encode($data));
的每个元素的索引。这不是最佳选择,而是一个非常简短的解决方案。