Допустим, у меня есть элементыКак отсортировать на основе заказа
items : [{id:1,...}, {id:2,...}, {id:3,...}]
и имеют заказ: [2, 3, 1] получить перечислимого
items : [{id:2,...}, {id:3,...}, {id:1,...}]
Я ожидаю, что это будет что-то в строках
items.Select(o => new {key = ordering[i++], value = o})
.OrderBy(k => k.key)
.Select(o => o.value)
но есть ли более чистое решение?
Далее я проверил эту работу (HimBromBeere, Domysee, qxg)
var expectedOrder = ordering.Select(x => result.First(o => o.Id == x));
var expectedOrder = result.OrderBy(item => Array.FindIndex(ordering,i => i == item.Id));
var expectedOrder = result.OrderBy(item => ordering.ToList().FindIndex(i => i == item.Id));
var expectedOrder =
from o in ordering
join i in result
on o equals i.Id
select i;
FWi, это было для проверочного испытания:
[Test]
[TestCase(1, 2, 3)]
[TestCase(1, 3, 2)]
[TestCase(2, 1, 3)]
[TestCase(2, 3, 1)]
[TestCase(3, 1, 2)]
public void Test_Should_Fail_If_GetMessages_Does_Not_Return_Sorted_By_Sent_Then_By_Id_Result(params int[] ordering)
{
var questions = GetQuestionsData();
Mock.Get(_questionService)
.Setup(o => o.GetQuestions())
.Returns(questions);
var result = _mailboxService.GetMessages();
var expectedOrder = ordering.Select(x => result.First(o => o.Id == x));
// Act
Action sortOrder =() => expectedOrder.Should()
.BeInDescendingOrder(o => o.Sent)
.And.BeInDescendingOrder(o => o.Id);
// Assert
sortOrder.ShouldThrow<AssertionException>();
}
Возможно, лучше использовать соединение, чтобы сделать код более читаемым.Также может быть немного безопаснее, так как i ++ больше не требуется. – momar
Насколько вы чисты? Нынешнее решение неплохое. – qxg
Просто, чтобы быть понятным, «упорядочивает» список из 1 основанных индексов или список идентификаторов в том порядке, в котором вы хотите? Поскольку вы получаете кучу ответов, которые принимают свой список идентификаторов (которые соответствуют этому примеру), но вы используете текущий код, который фактически не использует идентификатор для поиска значения в 'ordering'. – juharr