1

我正在尝试按照另一个数组定义的顺序创建一个字符串集合。我知道听起来很混乱,所以让我解释一下

requiredOrderOfElements

{  
[0] category1,  
[1] categoryX,  
[2] something else  
}

我的客户传递了一个包含键和值的字符串数组,即

从客户端传递

{  
[0][0] categoryX,  
[0][1] value from Category X,  
[1][0] something else,  
[1][1] value for something else,  
[2][0] category1,  
[2][1] value from Category 1  
}

我想要的是按所需键顺序的“值”文本

我想要的是

[0]value from Category 1  
[1]value from Category X  
[2]value for something else 

我查看了 OrderBy / IComparer 并且看不到实现我需要的明显方法。我目前的解决方案是一个丑陋的嵌套 for 循环

任何关于更优雅方式的想法将不胜感激。

更新: - 这是测试

[TestFixture]
public class GL_Linq_Test
{
    [Test]
    public void CanOrderByAnotherArray()
    {
        var requiredOrder=new[]{"my","required","order"};
        var passedFromClient = new[]
                                   {
                                       new[] {"required", "cat"},
                                       new[] {"order", "dog"},
                                       new[] {"my", "bird"}
                                   };

        var ordered = FunkyOrderer.Order(requiredOrder, passedFromClient);

        Assert.That(ordered.First()[1],Is.EqualTo("bird"));
        Assert.That(ordered.Skip(1).First()[1], Is.EqualTo("cat"));
        Assert.That(ordered.Skip(2).First()[1], Is.EqualTo("dog"));
    }
}

public static class FunkyOrderer
{
//returns order bird,dog,cat not bird,cat,dog        
public static IEnumerable<string[]> Order(string[] requiredOrder, IEnumerable<string[]>passedFromClient)
    {
        return from o in requiredOrder
                     join f in passedFromClient on o equals f[0]
                     orderby o
                     select f;
    }
}
4

2 回答 2

2

问题是您假设字符串数组将按其索引排序(它们不会)。"my", "order", "required"使用内置字符串比较器的顺序是正确的。最简单的解决方案是修改您的 LINQ 查询,以便在订购时考虑索引。

return from o in requiredOrder.Select((o, i) => new { Value = o, Index = i })
       join f in passedFromClient on o.Value equals f[0]
       orderby o.Index
       select f;
于 2009-04-30T04:16:33.140 回答
0
    var orderByThese = new string[] { "category1", "categoryX", "something else" };

    var fromClient = new string[][] 
    {
        new string[] { "categoryX", "value from Category X" },
        new string[] { "something else", "value for something else" },
        new string[] { "category1", "value from Category 1" }
    };

    var joined = from o in orderByThese
                 join f in fromClient on o equals f[0]
                 orderby o
                 select f;
于 2009-04-30T02:47:21.543 回答