बूलियन द्वारा लाइनक आदेश


111

मुझे एक linq क्वेरी मिली है जिसे मैं f.bar द्वारा ऑर्डर करना चाहता हूं, जो एक स्ट्रिंग है, लेकिन मैं इसे f.foo द्वारा भी ऑर्डर करना चाहता हूं, जो कि बूलियन फ़ील्ड है, पहले। नीचे क्वेरी की तरह।

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

यद्यपि यह संकलन करता है यह अपेक्षा के अनुरूप काम नहीं करता है। यह सिर्फ एफ द्वारा आदेश देता है। बूलियन क्षेत्र की अनदेखी करना।

मुझे पता चल रहा है कि मैं बहुत छोटा हूं, लेकिन इस व्यवहार को पाने के लिए मुझे क्या करना होगा?

धन्यवाद

जवाबों:


175

यह ठीक काम करना चाहिए - यह falseपहले एक फू मूल्य के साथ संस्थाओं को आदेश देना चाहिए , फिर एक trueफू मूल्य के साथ।

यह निश्चित रूप से LINQ में वस्तुओं के लिए काम करता है - जो LINQ प्रदाता आप वास्तव में उपयोग कर रहे हैं?

यहाँ एक LINQ ऑब्जेक्ट्स उदाहरण के लिए है जो काम करता है :

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 हमेशा झूठ था .... इसलिए शर्मिंदा
mat-mcloughlin

5
सही, false(0) trueआरोही (डिफ़ॉल्ट) क्रमबद्ध क्रम में पहले (1 ) आता है ।
रेशमकीट

मैं कॉलम 2 में सच की संख्या से कॉलम 1 को कैसे समूहित करूं?
ओरक्युलर मैन

2
@OracularMan: मेरा सुझाव है कि आप एक विस्तृत उदाहरण के साथ एक नया प्रश्न पूछें।
जॉन स्कीट

1
@ सिपो: असdata.OrderBy(d => d.x).ThenBy(d => d.y)
जॉन स्कीट

119

बस यह करना चाहता था और ऐसा लगता है जैसे कोई अंतर्निहित आदेश नहीं है। मैंने निम्नलिखित अधिक स्पष्ट होने के लिए किया:

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

असत्य के लिए कुछ सच करने के लिए।


27
मैं इस तरह से बनाया तरह से अधिक पसंद है। मुख्य रूप से क्योंकि भले ही सच / गलत के लिए एक निहित आदेश हो, यह वास्तव में किसी के लिए भी स्पष्ट नहीं है जिसने इसे पहले नहीं किया है। इसलिए कोई व्यक्ति जो भविष्य में कोड को देखना नहीं जानता है, वह सोच सकता है कि यह गलत के लिए सही है, जब वास्तव में यह गलत से सही होता है ... कम से कम इस समाधान के साथ, कोड यह दर्दनाक रूप से स्पष्ट करता है कि आप किस तरह से छांटना चाहते हैं।
राबर्ट नैक जुले

2
हाँ मुझे कोड में पसंद है! यदि आपको कोड को समझने के लिए प्रलेखन पढ़ने के लिए msdn या स्टेक्टओवरफ़्लो पर जाना है, तो मेरी राय में यह बहुत अच्छा कोड नहीं है
जोनिरा

2
मेरे लिए जादू की संख्या की तरह खुशबू आ रही है। क्या मैं यह मानने में गलत हूं कि प्रत्येक प्रोग्रामर को स्वाभाविक रूप से अच्छी तरह से पता होना चाहिए कि बुलियन का trueमतलब a single bit set to 1क्या है ? मेरे लिए, के true > falseबारे में के रूप में स्पष्ट रूप से हो सकता है की सच्चाई है।
Mels

4
@ मैल्स मैजिक नंबर नहीं। केवल छँटाई और छँटाई के लिए उपयोग किए जाने वाले स्पष्ट मान। मान 42 और 69 हो सकते हैं, बिंदु यह है कि कोड का पाठक जानता है कि उनमें से एक छोटा है, इसलिए पहले होगा। कोड का पाठक शायद यह नहीं जानता है कि ऑर्डरबाय किस तरह से बूल डाल देगा - पहले सच होगा, या पहले गलत होगा। true > falseसार्वभौमिक रूप से ज्ञात नहीं है, जबकि 1 > 0है।
दान एफ

9
ध्यान दें कि .OrderBy(e => e.SomeFlag == true)बराबर होगा .OrderBy(e => e.SomeFlag)जबकि .OrderBy(e => e.SomeFlag ? 0 : 1)के बराबर है .OrderByDescending(e => e.SomeFlag)। पहले दो प्रकार झूठे सच से पहले, दूसरे दो तरह झूठ सच से पहले।
एरीएफ89

0

यदि आपको सूची क्रम सही है, तो कृपया निम्नलिखित कोड का प्रयास करें।

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; 
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.