如何根据排序排序 [英] How to sort based on ordering
本文介绍了如何根据排序排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
可以说我有项目
项:[{ID:1,...},{ID:2, ...},{ID:3,...}]
和有订购:[2,3,1] 即可得到一个枚举
项:[{ID:2 .. },{ID:3,...},{ID:1,...}]
我希望它是什么在
线
items.Select(O = gt;新建{键=排序[我++],值= O})
.OrderBy(K => k.key)
。选择(O => o.value)
但有一个清洁的解决方案?
下面笔者已经验证工作(HimBromBeere,Domysee,QXG)
VAR expectedOrder = ordering.Select(X =>的结果。首先(O => o.Id == X));
VAR expectedOrder = result.OrderBy(项目=> Array.FindIndex(订货,I = I标记== item.Id));
变种expectedOrder = result.OrderBy(项目= GT; ordering.ToList()FindIndex(ⅰ=方式>我== item.Id));从o在订购
变种expectedOrder =
加入我的结果
邻等于i.Id
选择我;
FWI,这是验证测试:
[测试]
[TestCase的(1,2,3)
[TestCase的(1,3, 2)]
[测试用例(2,1,3)]
[测试用例(2,3,1)]
[测试用例(3,1,2)]
公无效Test_Should_Fail_If_GetMessages_Does_Not_Return_Sorted_By_Sent_Then_By_Id_Result(PARAMS INT []排序)
{
VAR问题= GetQuestionsData();
Mock.Get(_questionService)
.Setup(O => o.GetQuestions())
.Returns(问题);
VAR的结果= _mailboxService.GetMessages();
VAR expectedOrder = ordering.Select(X => result.First(O = GT; o.Id == X));
//法案
行动中将sortOrder =()=> expectedOrder.Should()
.BeInDescendingOrder(O => o.Sent)
.And.BeInDescendingOrder(O => o.Id);
//断言
sortOrder.ShouldThrow< AssertionException>();
}
解决方案
事情是这样的我猜:
VAR的结果= ordering.Select(X => items.First(Y => y.id ==的X. ID));
的例子:
VAR项目=新的[] {新{ID = 1,名称=1},新的{ID = 2,名称=2}新的{ID = 3,NAME =3 },{新ID = 4,NAME =4}};
变种结果=新[] {2,3,1}。选择(X => items.First(γ= GT; y.id == x)的);
这也过滤了那些项目
出来,其指数不包含在订购
。
Lets say I have items
items : [{id:1,...}, {id:2,...}, {id:3,...}]
and have ordering : [2, 3, 1] to get an enumerable
items : [{id:2,...}, {id:3,...}, {id:1,...}]
I expect it to be something in the lines of
items.Select(o => new {key = ordering[i++], value = o})
.OrderBy(k => k.key)
.Select(o => o.value)
but is there a cleaner solution?
Following I have verified that work (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, this was for verification test:
[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>();
}
解决方案
Something like this I guess:
var result = ordering.Select(x => items.First(y => y.id == x.id));
Working example:
var items = new[] { new { id = 1, name = "1" }, new { id = 2, name = "2" }, new { id = 3, name = "3" }, new { id = 4, name = "4" } };
var result = new[] { 2, 3, 1 }.Select(x => items.First(y => y.id == x));
This also filters those items
out, whose index is not contained in ordering
.
这篇关于如何根据排序排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文