auf Bestellung Können sagen, ich ArtikelWie sortieren
items : [{id:1,...}, {id:2,...}, {id:3,...}]
haben und Ordnung: [2, 3, 1] eine zählbare
items : [{id:2,...}, {id:3,...}, {id:1,...}]
ich es erwarten bekommen etwas in den Zeilen von
items.Select(o => new {key = ordering[i++], value = o})
.OrderBy(k => k.key)
.Select(o => o.value)
aber gibt es eine sauberere Lösung?
Folge habe ich, dass die Arbeit (HimBromBeere, Domysee, qxg) verifiziert
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, das für die Überprüfung Test war:
[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>();
}
Es könnte besser sein, eine Verknüpfung zu verwenden, um den Code lesbarer zu machen.Auch könnte ein bisschen sicherer sein, da das i ++ nicht mehr benötigt wird. – momar
Wie sauber willst du? Die aktuelle Lösung ist nicht schlecht. – qxg
Nur um klar zu sein, ist 'bestellen' eine Liste von 1 basierten Indizes oder eine Liste von IDs in der Reihenfolge, die Sie wollen? Weil Sie eine Reihe von Antworten erhalten, die eine Liste der IDs annehmen (die mit dem Beispiel übereinstimmt), aber Ihr aktueller Code verwendet die ID nicht, um einen Wert in der 'Reihenfolge' zu suchen. – juharr