বুলিয়ান দ্বারা লিনাক অর্ডার


111

আমি একটি লিনক ক্যোয়ারী পেয়েছি যা আমি f.bar দ্বারা অর্ডার করতে চাই, এটি একটি স্ট্রিং, তবে আমি এটি প্রথমে একটি বুলিয়ান ক্ষেত্র, f.foo দ্বারাও অর্ডার করতে চাই। নীচের কোয়েরি পছন্দ করুন।

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

যদিও এটি সংকলন এটি প্রত্যাশার মতো কাজ করে না। এটি কেবল বুলিয়ান ক্ষেত্রটি উপেক্ষা করে f.bar দ্বারা আদেশ দেয়।

আমি বুদ্ধিমান হয়ে যাচ্ছি আমি জানি, তবে এই আচরণটি করার জন্য আমার কী করা দরকার?

ধন্যবাদ

উত্তর:


175

এটি সূক্ষ্মভাবে কাজ করা উচিত - এটি falseপ্রথমে একটি foo মান সহ সত্তাগুলি অর্ডার করা উচিত , তারপরে truefoo মান সহ।

এটি অবশ্যই লিনকিউ থেকে অবজেক্টে কাজ করে - আপনি কোন লিনকিউ সরবরাহকারী ব্যবহার করছেন?

এখানে অবজেক্টস উদাহরণ থেকে 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 সর্বদা মিথ্যা ছিল .... তাই বিব্রত
মাদুর-ম্যাক্লোকলিন

5
সঠিক, false(0) trueক্রমবর্ধমান (ডিফল্ট) সাজানোর ক্রমে (1) এর আগে আসে ।
সিল্কফায়ার

আমি কীভাবে কলাম 2 এ কলাম 2 এর সংখ্যার দ্বারা সংখ্যান করব?
ওরাকুলার ম্যান

2
@ ওরাকুলারম্যান: আমি আপনাকে বিস্তারিত উদাহরণ সহ একটি নতুন প্রশ্ন জিজ্ঞাসা করার পরামর্শ দিচ্ছি।
জন স্কিটি

1
@ সিপো: যেমনdata.OrderBy(d => d.x).ThenBy(d => d.y)
জন স্কিইট

119

কেবল এটি করতে চেয়েছিলেন এবং মনে হয় এটি কোনও অন্তর্নিহিত ক্রম ছাড়াই। আমি আরও সুস্পষ্ট হওয়ার জন্য নিম্নলিখিতগুলি করেছি:

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

সত্য কিছু মিথ্যা বাছাই।


27
আমি সাজানো এটিকে আরও ভালভাবে তৈরির চেয়ে পছন্দ করি। মূলত কারণ সত্য / মিথ্যাটির জন্য অন্তর্নিহিত অর্ডারিং থাকা সত্ত্বেও, এটি আগে কখনও করেন নি এমন কারও পক্ষে এটি সত্যই স্পষ্ট নয়। সুতরাং যে কেউ ভবিষ্যতে কোডটির দিকে তাকিয়ে থাকতে জানে না তারা ভাবতে পারে যে এটি মিথ্যা থেকে সত্যকে সাজানো হয়েছে, যখন সত্যই এটি সত্য থেকে মিথ্যা বাছাই করে ... অন্তত এই সমাধানের সাহায্যে কোডটি এটিকে বেদনাদায়কভাবে সুস্পষ্ট করে তোলে যে আপনি কোনভাবে বাছাই করতে চান।
রবার্ট নোক

2
হ্যাঁ আমি কোডে এটি পছন্দ করি! কোড বোঝার জন্য যদি আপনাকে ডকুমেন্টেশন পড়তে এমএসডিএন বা স্ট্যাকওভারফ্লোতে যেতে হয় তবে এটি আমার মতে দুর্দান্ত কোড নয়
জনিআআআআআ

2
আমার কাছে ম্যাজিক নম্বরের মতো গন্ধ আছে। আমি কি ধরে নিচ্ছি যে প্রতিটি প্রোগ্রামারকে অন্তর্নিহিতভাবে খুব ভালভাবে জানা উচিত যে একটি বুলিয়ান trueমানে a single bit set to 1? আমার কাছে, সত্যটি true > falseযতটা স্পষ্ট তা হতে পারে obvious
মেল

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)। সত্যের আগে প্রথম দুটি প্রকারের মিথ্যা, অন্য দুটি ধরণের পূর্বে সত্য।
EriF89

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; 
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.