c# - 如何根据顺序排序

标签 c# .net lambda

假设我有元素

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>();
    }

最佳答案

我猜是这样的:

var result = ordering.Select(x => items.First(y => y.id == x.id));

工作示例:

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));

这也会过滤掉那些 items,其索引不包含在 ordering 中。

关于c# - 如何根据顺序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34223684/

相关文章:

.net - SQLite 安全 Windows Phone 8.1

.net - 结合内联和非可变 bool 模块属性的场景中的 JIT 优化

c# - 在 C# 中执行多线程事件的奇怪行为

lambda - Collectors.toMap 的 mergeFunction 是否允许修改其参数?

c# - 当第二个数字大于第一个数字时,为什么 Mod 运算符返回第一个数字?

c# - 如何在自定义模板中使用自定义属性?

c# - 如何重置捕获像素的值

c# - 简单的注入(inject)器为不同的命令使用不同的装饰器

.net - 单声道多声道播放器

c# - 如何正确使用C#Linq获取过滤列表?