부울에 의한 Linq 순서


111

문자열 인 f.bar로 정렬하려는 linq 쿼리가 있지만 먼저 부울 필드 인 f.foo로 정렬하고 싶습니다. 아래 쿼리와 같습니다.

(from f in foo
orderby f.foo, f.bar
select f)

이것이 컴파일되지만 예상대로 작동하지 않습니다. 부울 필드를 무시하고 f.bar로 정렬합니다.

내가 알고있는 멍청한 짓이지만이 동작을 얻으려면 어떻게해야합니까?

감사

답변:


175

그것은 잘 작동합니다 false-foo 값을 가진 엔티티를 먼저 정렬 한 다음 foo 값을 가진 엔티티를 정렬해야 true합니다.

LINQ to Objects에서 확실히 작동합니다. 실제로 어떤 LINQ 공급자를 사용하고 있습니까?

다음 작동 하는 LINQ to Objects 예제입니다 .

using System;
using System.Linq;

public static class Test
{
    public static void Main()
    {
        var data = new[]
        {
            new { x = false, y = "hello" },
            new { x = true, y = "abc" },
            new { x = false, y = "def" },
            new { x = true, y = "world" }
        };

        var query = from d in data
                    orderby d.x, d.y
                    select d;

        foreach (var result in query)
        {
            Console.WriteLine(result);
        }
    }

}

51
에픽 실패는 ... 너무 당황 .... 의미 f.foo 항상 거짓이었다 버그 때문 실현
매트 맥 로린

5
맞습니다. 오름차순 (기본값) 정렬 순서에서 false(0)이 true(1) 앞에옵니다 .
silkfire 2017-04-09

Column1을 열 2의 true 수로 어떻게 그룹화합니까?
Oracular Man

2
@OracularMan : 자세한 예를 들어 새로운 질문을하는 것이 좋습니다.
Jon Skeet

1
@Sipo :로data.OrderBy(d => d.x).ThenBy(d => d.y)
존 소총

119

그냥 이것을하고 싶었고 암시적인 순서가없는 것처럼 보입니다. 더 명확하게하기 위해 다음을 수행했습니다.

Something.OrderBy(e=>e.SomeFlag ? 0 : 1) 

참에서 거짓으로 분류합니다.


27
나는 내장 방식보다 이것을 더 좋아합니다. 주로 참 / 거짓에 대한 묵시적 순서가 있더라도 이전에 해본 적이없는 사람에게는 분명하지 않기 때문입니다. 그래서 미래에 코드를 보는 것을 모르는 사람은 그것이 참에서 거짓으로 분류된다고 생각할 수 있습니다. 정말로 그것이 거짓에서 참으로 분류 될 때 ... 적어도이 솔루션을 사용하면 코드는 당신이 어떤 방식으로 분류하려고하는지 고통스럽게 분명하게 만듭니다.
Robert Noack 2013-07-29

2
그래, 나는 그것을 코드에서 좋아한다! 코드를 이해하기 위해 문서를 읽기 위해 msdn 또는 stackoverflow로 이동해야한다면 제 의견으로는 훌륭한 코드가
아닙니다

2
나에게 마법의 숫자 같은 냄새가 난다. 모든 프로그래머가 부울이 true의미 하는 바를 본질적으로 잘 알고 있어야한다고 가정하는 것이 잘못 a single bit set to 1입니까? 나에게 진실 true > false은 가능한 한 분명합니다.
Mels 2014

4
@Mels는 마법의 숫자가 아닙니다. 정렬 및 정렬에만 사용되는 명시 적 값입니다. 값은 42와 69가 될 수 있으며, 요점은 코드를 읽는 사람이 그중 하나가 더 작다는 것을 알고 있으므로 첫 번째가 될 것입니다. 코드를 읽는 사람은 OrderBy가 어떤 방식으로 bool을 넣을지 알지 못합니다. true가 첫 번째인지 아니면 false가 첫 번째인지 알 수 없습니다. true > false보편적으로 알려지지 않은 반면 1 > 0입니다.
Dan F

9
.OrderBy(e => e.SomeFlag == true)에 해당 될 것입니다 .OrderBy(e => e.SomeFlag)반면 .OrderBy(e => e.SomeFlag ? 0 : 1)에 해당합니다 .OrderByDescending(e => e.SomeFlag). 처음 두 개는 true 전에 false를 정렬하고 다른 두 개는 false 전에 true를 정렬합니다.
EriF89

0

true로 목록 순서를 얻으면 다음 코드를 시도하십시오.

db.member.where(x=>x.id==memberId).OrderBy(x=>!x.IsPrimary?1:0).ToList();

0

사용되는 순서에 대해 더 명확하게하기 위해.

Something.OrderBy(e => e.SomeFlag, new BooleanComparer());

public class BooleanComparer : IComparer<bool>
{
    public int Compare(bool x, bool y)
    {
        int p = x ? 1 : 0;
        int q = y ? 1 : 0;
        return p - q; 
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.