문제
다른 배열로 정의 된 순서로 문자열 모음을 만들려고합니다. 혼란 스러워요. 설명해 드리겠습니다
필수 요정 요소
{
[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-Loop입니다
보다 우아한 방법에 대한 아이디어는 감사 할 것입니다.
업데이트 : - 테스트는 다음과 같습니다
[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;
}
}
해결책
문제는 문자열 배열이 인덱스에 의해 주문된다고 가정한다는 것입니다 (그렇지 않습니다). 의 순서 "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;
다른 팁
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;
제휴하지 않습니다 StackOverflow