সি # তালিকা <> x অনুসারে বাছাই করুন y


88

অনুরূপ তালিকা <> OrderBy বর্ণানুক্রমিক , আমরা এক উপাদান, তারপর অন্যের দ্বারা বাছাই করতে চাই। আমরা এর কার্যকরী সমতুল্য অর্জন করতে চাই

SELECT * from Table ORDER BY x, y  

আমাদের একটি ক্লাস রয়েছে যাতে অনেকগুলি বাছাই ফাংশন রয়েছে এবং আমাদের একটি উপাদান দ্বারা বাছাই করার কোনও সমস্যা নেই।
উদাহরণ স্বরূপ:

public class MyClass {
    public int x;
    public int y;
}  

List<MyClass> MyList;

public void SortList() {
    MyList.Sort( MySortingFunction );
}

এবং আমাদের তালিকায় নিম্নলিখিতটি রয়েছে:

Unsorted     Sorted(x)     Desired
---------    ---------    ---------
ID   x  y    ID   x  y    ID   x  y
[0]  0  1    [2]  0  2    [0]  0  1
[1]  1  1    [0]  0  1    [2]  0  2
[2]  0  2    [1]  1  1    [1]  1  1
[3]  1  2    [3]  1  2    [3]  1  2

স্থিতিশীল বাছাই পছন্দনীয় হবে, কিন্তু প্রয়োজন হয় না। সমাধান। নেট 2.0 এর জন্য কাজ করে এমনটি স্বাগত।


@ বলু আমি পোস্ট সংস্করণটি অজ্ঞেয় এবং এর সাথে মিলে যাওয়ার জন্য আপডেট করা উত্তরগুলি তৈরি করার জন্য ট্যাগটি স্পষ্টভাবে মুছে ফেলেছি। আপনি যদি মনে করেন যে 4.0 / 2.0 যথেষ্ট পরিমাণে বিশিষ্ট না হয় তবে ট্যাগটি পুনরুদ্ধার করার পরিবর্তে প্রশ্নে একটি স্পষ্টতামূলক সম্পাদনা করার কথা বিবেচনা করুন।
আলেক্সি লেভেনকভ

দুঃখিত @ অ্যালেক্সেইলেভেনকভ, খুব বেশি মনোযোগ দেননি, দয়া করে নির্দ্বিধায় রোল ব্যাক করুন।
বলু

ঠিক আছে. পরিবর্তনটি ফিরিয়ে দিয়েছে।
আলেক্সি লেভেনকভ

এই প্রশ্নটি মূল মাত্র 2.0 থেকে সমস্ত সংস্করণটি কভার করার জন্য আপডেট করা হয়েছিল - বিভিন্ন ফ্রেমওয়ার্ক এবং প্রয়োজনীয়তার জন্য বেশ কয়েকটি বিকল্প উত্তর রয়েছে - কোনটি আপনার প্রয়োজনীয়তা আরও ভাল ফিট করে তা দেখতে সমস্ত পরীক্ষা করে দেখুন।
আলেক্সি লেভেনকভ

উত্তর:


98

মনে রাখবেন যে আপনার যদি সমস্ত সদস্যের তুলনা করা হয় তবে আপনার কোনও স্থিতিশীল সাজানোর দরকার নেই। অনুরোধ অনুসারে 2.0 সমাধানটি এর মতো দেখতে পারে:

 public void SortList() {
     MyList.Sort(delegate(MyClass a, MyClass b)
     {
         int xdiff = a.x.CompareTo(b.x);
         if (xdiff != 0) return xdiff;
         else return a.y.CompareTo(b.y);
     });
 }

মনে রাখবেন যে এই ২.০ দ্রবণটি জনপ্রিয় ৩.৫ লিনক দ্রবণের চেয়েও পছন্দনীয়, এটি একটি স্থান স্থিরভাবে সম্পাদন করে এবং লিনক পদ্ধতির ও (এন) স্টোরেজ প্রয়োজনীয়তা রাখে না। আপনি যদি না তালিকার মূল তালিকা অবজেক্টটিকে অবশ্যই অস্পৃশ্য হতে চান।


156

.NET এর সংস্করণগুলির জন্য যেখানে আপনি লিনকিউ OrderByএবং ব্যবহার করতে পারেন ThenBy(বা ThenByDescendingযদি প্রয়োজন হয়):

using System.Linq;
....
List<SomeClass>() a;
List<SomeClass> b = a.OrderBy(x => x.x).ThenBy(x => x.y).ToList();

দ্রষ্টব্য: নেট নেট ২.০ এর জন্য (বা আপনি যদি লিনকিউ ব্যবহার করতে না পারেন) এই প্রশ্নের উত্তর হ্যানস প্যাস্যান্ট দেখুন ।


4
Phoog দ্বারা অন্য উত্তর এখানে পোস্ট থেকে: stackoverflow.com/questions/9285426/... এটি একটি নতুন অনুক্রমে মূল আইটেম সঙ্গে অন্য তালিকা তৈরি করে। এটি কেবল তখনই কার্যকর যখন আপনার অন্য কোনও উদ্দেশ্যে মূল ক্রম সংরক্ষণ করতে হবে; জায়গাটি তালিকায় বাছাই করার চেয়ে এটি মেমরির চেয়ে বেশি অপব্যয়ী
dreamerkumar

5

কৌশলটি একটি স্থিতিশীল বাছাই বাস্তবায়ন করা হয়। আমি একটি উইজেট শ্রেণি তৈরি করেছি যাতে আপনার পরীক্ষার ডেটা থাকতে পারে:

public class Widget : IComparable
{
    int x;
    int y;
    public int X
    {
        get { return x; }
        set { x = value; }
    }

    public int Y
    {
        get { return y; }
        set { y = value; }
    }

    public Widget(int argx, int argy)
    {
        x = argx;
        y = argy;
    }

    public int CompareTo(object obj)
    {
        int result = 1;
        if (obj != null && obj is Widget)
        {
            Widget w = obj as Widget;
            result = this.X.CompareTo(w.X);
        }
        return result;
    }

    static public int Compare(Widget x, Widget y)
    {
        int result = 1;
        if (x != null && y != null)                
        {                
            result = x.CompareTo(y);
        }
        return result;
    }
}

আমি আইকোম্যাপারেবল বাস্তবায়ন করেছি, তাই এটি তালিকা-অনুসারে বাছাই করা যায় ort

যাইহোক, আমি স্থিতিশীল পদ্ধতি তুলনাও প্রয়োগ করেছি, যা কোনও অনুসন্ধান পদ্ধতির প্রতিনিধি হিসাবে পাস হতে পারে।

আমি এই সন্নিবেশ সাজানোর পদ্ধতিটি সি # 411 থেকে ধার নিয়েছি :

 public static void InsertionSort<T>(IList<T> list, Comparison<T> comparison)
        {           
            int count = list.Count;
            for (int j = 1; j < count; j++)
            {
                T key = list[j];

                int i = j - 1;
                for (; i >= 0 && comparison(list[i], key) > 0; i--)
                {
                    list[i + 1] = list[i];
                }
                list[i + 1] = key;
            }
    }

আপনি আপনার প্রশ্নে উল্লিখিত বাছাইকারী সহায়ক শ্রেণিতে এটি রাখবেন।

এখন, এটি ব্যবহার করতে:

    static void Main(string[] args)
    {
        List<Widget> widgets = new List<Widget>();

        widgets.Add(new Widget(0, 1));
        widgets.Add(new Widget(1, 1));
        widgets.Add(new Widget(0, 2));
        widgets.Add(new Widget(1, 2));

        InsertionSort<Widget>(widgets, Widget.Compare);

        foreach (Widget w in widgets)
        {
            Console.WriteLine(w.X + ":" + w.Y);
        }
    }

এবং এটি ফলাফল:

0:1
0:2
1:1
1:2
Press any key to continue . . .

এটি সম্ভবত কিছু বেনাম প্রতিনিধিদের দ্বারা পরিষ্কার করা যেতে পারে, তবে আমি এটি আপনার কাছে রেখে দেব।

সম্পাদনা : এবং NoBugz বেনামী পদ্ধতির শক্তি প্রদর্শন করে ... সুতরাং, আমার আরও ওল্ডস্কুল বিবেচনা করুন: পি



1

আমার একটি সমস্যা ছিল যেখানে অর্ডারবাই এবং থেইনবাই আমাকে পছন্দসই ফলাফল দেয়নি (বা আমি ঠিক কীভাবে সেগুলি সঠিকভাবে ব্যবহার করতে হয় তা জানতাম না)।

আমি একটি তালিকা নিয়ে গেলাম solution সমাধান এর মতো কিছু করুন।

    var data = (from o in database.Orders Where o.ClientId.Equals(clientId) select new {
    OrderId = o.id,
    OrderDate = o.orderDate,
    OrderBoolean = (SomeClass.SomeFunction(o.orderBoolean) ? 1 : 0)
    });

    data.Sort((o1, o2) => (o2.OrderBoolean.CompareTo(o1.OrderBoolean) != 0
    o2.OrderBoolean.CompareTo(o1.OrderBoolean) : o1.OrderDate.Value.CompareTo(o2.OrderDate.Value)));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.