我正在尝试按照另一个数组定义的顺序创建字符串集合。听起来令人困惑我知道所以让我解释一下
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;
}
}
答案 0 :(得分: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;
答案 1 :(得分: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;