按第二列表顺序在第二列表中选择相同元素

时间:2017-07-08 10:40:32

标签: c# list linq linked-list

我有两个字符数组列表:

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'

2 个答案:

答案 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返回charBecho gzencode(json_encode($data)); 的每个元素的索引。这不是最佳选择,而是一个非常简短的解决方案。