如何根据排序排序 [英] How to sort based on ordering

查看:140
本文介绍了如何根据排序排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

可以说我有项目

 项:[{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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆