sipariş dayalı sıralamak için bennasıl
items : [{id:1,...}, {id:2,...}, {id:3,...}]
çizelgesine ve var Diyelim sipariş: [2, 3, 1] olsun ben olmasını bekliyoruz enumerable
items : [{id:2,...}, {id:3,...}, {id:1,...}]
Ancak bir şey daha temiz bir çözüm var mı?
ben bu doğrulama testi için oldu, o işi (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 doğruladıktan takiben:
sanırım böyle[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>();
}
Kodu daha okunaklı hale getirmek için birleşim kullanmak daha iyi olabilir.Ayrıca i ++ artık gerekli olmadığından biraz daha güvenli olabilir. – momar
Ne kadar temizsiniz? Mevcut çözüm kötü değil. – qxg
Sadece açık olmak gerekirse, onları istediğiniz sırayla 1 tabanlı dizinlerin veya ids listesinin bir listesini 'sipariş etmek'? Çünkü, bir kimlik listesine sahip olursunuz. Bu, bir örnek (yani, bu örnekle eşleşen) kimliğinin bir listesini alır, ancak geçerli kod, aslında 'siparişte' bir değer aramak için kimliği kullanmaz. – juharr