2009-04-29 89 views
1

我想按另一个数组定义的顺序创建一个字符串集合。听起来有点混乱我知道,所以让我解释一下LINQ OrderBy需要帮助

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 
} 
通过我的客户端通过了包含键和值的字符串数组

我想要的是要求中的“价值”文本按键

的d为了什么,我想

[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; 
    } 
} 
+1

@Gilly - 这是不够的信息,甚至开始有意义。请张贴一些示例代码或每个数组实际外观的布局。 – 2009-04-30 00:33:30

+0

嗯,不知道还有什么要投入!我会在下面发布一个测试,看看是否能更好地解释它 – Gilly 2009-04-30 03:44:41

回答

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; 
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; 
+0

不完全 - 正确获取阵列中的第一项,但其他两项错误。我会发布一个测试 – Gilly 2009-04-30 03:52:09