Сортировать один массив из другого порядка массива? - PullRequest
3 голосов
/ 01 марта 2011
var listOne = new string[] { "dog", "cat", "car", "apple"};
var listTwo = new string[] { "car", "apple"};

Мне нужно заказать listOne по порядку элементов в listTwo (если есть). Таким образом, новый список будет в таком порядке; "машина", "яблоко", "собака", "кошка"

Я хотел бы сделать это в LINQ и попробовал это;

var newList = from l1 in listOne
              join l2 in listTwo on l1 equals l2 in temp
              from nl temp.DefaultIfEmpty()
              select nl;

Но он возвращает ноль, так что, очевидно, мой Linq-Fu слаб Любой совет приветствуется.

Ответы [ 2 ]

4 голосов
/ 01 марта 2011

Вам нужны все элементы из списка два, которые находятся в списке один, а затем остальные элементы из списка один?

var results = listTwo.Intersect(listOne).Union(listOne);
foreach (string r in results)
{
    Console.WriteLine(r);
}
3 голосов
/ 01 марта 2011

Хорошо, позвольте мне перефразировать ваши требования к сортировке:

  1. Сначала все элементы из первого списка, которые также присутствуют во втором списке, и возвращают их в порядке их появления во втором списке, или : все элементы из второго списка , если они появляются в первом списке
  2. Затем все элементы из первого списка, которых нет в этом втором списке, и вернуть их в порядке их появления в этом первом списке

Этот код поможет:

void Main()
{
    var listOne = new string[] { "dog", "cat", "car", "apple"};
    var listTwo = new string[] { "car", "apple"};

    var elements1 =
        from element in listTwo
        where listOne.Contains(element)
        select element;
    var elements2 =
        from element in listOne
        where !listTwo.Contains(element)
        select element;

    elements1.Concat(elements2).Dump();
}

Вы также можете переписать его без синтаксиса LINQ, чтобы сделать его немного короче:

void Main()
{
    var listOne = new string[] { "dog", "cat", "car", "apple"};
    var listTwo = new string[] { "car", "apple"};

    var elements = listTwo.Where(e => listOne.Contains(e))
        .Concat(listOne.Where(e => !listTwo.Contains(e)));

    elements.Dump();
}

Выход (через LINQPad ):

car 
apple 
dog 
cat 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...