তালিকা <টি> আদেশক্রমে বর্ণানুক্রমিক আদেশ


442

আমি ফ্রেমওয়ার্ক 3.5 তে সি # ব্যবহার করছি। আমি দ্রুত একটি জেনেরিক বাছাই করতে চাই List<T>। এই উদাহরণের স্বার্থে, আসুন আমি বলি যে আমার কাছে Personলাস্টনামের সম্পত্তি সহ একটি ধরণের তালিকা রয়েছে । আমি ল্যাম্বডা এক্সপ্রেশনটি ব্যবহার করে এই তালিকাটি কীভাবে বাছাই করব?

List<Person> people = PopulateList();
people.OrderBy(???? => ?????)

উত্তর:


695

যদি আপনি কোনও স্থানের সাজান বোঝাতে চান (যেমন তালিকাটি আপডেট হয়েছে):

people.Sort((x, y) => string.Compare(x.LastName, y.LastName));

আপনি যদি একটি নতুন তালিকা বলতে চান:

var newList = people.OrderBy(x=>x.LastName).ToList(); // ToList optional

2
আমি বিশ্বাস করি যে প্রথমটি মানুষ হতে চায় Sসোর্ট ((x, y) => স্ট্রিং omp কম্প্যাকার (x.LastName, y.LastName) <0);
জেমস করান

36
@ জেমস: আমি এটি ভাবব না। তুলনা <টি> বুল হয় না
জন স্কিটি

2
আমি ভাবছি আপনি যদি অর্ডারবাই ফার্স্টনেম এবং লাস্টনেম চান ... আপনার কি লেখা উচিত?
বেলেক্সান্দ্রে

63
var newList = people.OrderBy (x => x.FirstName) .ThenBy (x => x.LastName) .ToList ();
মার্ক Gravell

4
@ ফারাজ (x, y) => x.price.CompareTo (y.price)
মার্ক গ্র্যাভেল

98

আপনার কি তালিকার স্থানে বাছাই করার দরকার আছে, বা তালিকার বিষয়বস্তুগুলির কেবল একটি আদেশযুক্ত ক্রম? দ্বিতীয়টি আরও সহজ:

var peopleInOrder = people.OrderBy(person => person.LastName);

জায়গায় বাছাই করতে আপনার একটি IComparer<Person>বা একটি দরকার Comparison<Person>। যে জন্য, আপনি বিবেচনা করতে পারেন ProjectionComparerমধ্যে MiscUtil

(আমি জানি আমি মিসকুলকে সামনে আনতে থাকি - এটি কেবল প্রাসঙ্গিক হয়েই থাকে ...)


1
এটি আমার পক্ষে কাজ করেছে, তবে কেবলমাত্র আমি যুক্ত করার পরেই ".ToList ()": সমসাময়িকরোগীবিস্মৃতবয়বার্থইয়ার = সমসাময়িক।
বি ক্লে শ্যানন

2
@ বি ক্লেশ্যানন: ঠিক আছে আপনার যদি List<T>প্রয়োজন হয় তবে আপনার পুনরুক্তি করতে চাইলে আপনার প্রয়োজন হবে না।
জন স্কিটে

23

আপনি লিনক ব্যবহার করতে পারেন :) ব্যবহার করে:

System.linq;
var newList = people.OrderBy(x=>x.Name).ToList();

23
people.OrderBy(person => person.lastname).ToList();

17
ঠিক আছে, এটি এখনও ফলাফলটি ধারণ করে না - আপনার বাম দিকে "তালিকা <পার্সন> লোক =" দরকার ...
মার্ক গ্র্যাভেল

8
এই উত্তরটি লিনকিউ ব্যবহার করার সময় সর্বাধিক সাধারণ ত্রুটি দেখায় - পদ্ধতিগুলি তালিকার সংশোধন OrderBy না করে বরং নতুন "সংগ্রহ" (সাধারণত অলস IEnumerable<T>) ফেরত দেয় যা কোনও কিছুর জন্য বরাদ্দ করা দরকার।
অ্যালেক্সি লেভেনকভ

2
@ অ্যালেক্সেইলেভেনকভ কীভাবে জানেন যে লিনকিউ ব্যবহারের সময় এটি সবচেয়ে সাধারণ ত্রুটি?
tymtam

13
private void SortGridGenerico< T >(
          ref List< T > lista       
    , SortDirection sort
    , string propriedadeAOrdenar)
{

    if (!string.IsNullOrEmpty(propriedadeAOrdenar)
    && lista != null
    && lista.Count > 0)
    {

        Type t = lista[0].GetType();

        if (sort == SortDirection.Ascending)
        {

            lista = lista.OrderBy(
                a => t.InvokeMember(
                    propriedadeAOrdenar
                    , System.Reflection.BindingFlags.GetProperty
                    , null
                    , a
                    , null
                )
            ).ToList();
        }
        else
        {
            lista = lista.OrderByDescending(
                a => t.InvokeMember(
                    propriedadeAOrdenar
                    , System.Reflection.BindingFlags.GetProperty
                    , null
                    , a
                    , null
                )
            ).ToList();
        }
    }
}

5

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

  • তালিকা। বাছাই করুন ()
  • তালিকা। বাছাই করুন (জেনেরিক তুলনা)
  • তালিকা। বাছাই করুন (জেনারিক আইকোপ্যামার)
  • তালিকা। বাছাই করুন (Int32, Int32, জেনেরিক আইকম্পারার)

5

আপনি এই কোড স্নিপেট ব্যবহার করতে পারেন:

var New1 = EmpList.OrderBy(z => z.Age).ToList();

যেখানে New1একটি হল List<Employee>

EmpListএকটি এর পরিবর্তনশীল List<Employee>

zEmployeeটাইপ একটি পরিবর্তনশীল ।


আনশুমন, varটাইপের মতো কিছুই নেই । New1হয় List<Employee>এবং zহয় Employee
নওফাল

5

আপনি ব্যবহার করতে পারেন

model.People = model.People.OrderBy(x => x.Name).ToList();

4
এই কোড নমুনা প্রশ্নের উত্তর দিতে পারে যদিও, এটি ব্যাখ্যা অভাব আছে। যেহেতু এটি এখন দাঁড়িয়ে আছে, এটি কোনও মূল্য যুক্ত করে না এবং ডাউনভোট / মুছে ফেলা হচ্ছে তার পরিবর্তনের জন্য দাঁড়িয়েছে। দয়া করে কিছু ব্যাখ্যা যুক্ত করুন যা কী করে এবং কেন এটি ওপি সমস্যার সমাধান।
oɔɯǝɹ

0

এটি সাধারণ জালিয়াতি। নীচে সুইচ দিয়ে কল করা।

dvm.PagePerifications আমার ভিউমোডেলে টাইপ তালিকার টির একটি সম্পত্তি এই ক্ষেত্রে টি একটি EF6 মডেল শ্রেণি যা পেজ_প্রেমিশন বলে।

dvm.UserNameSortDir হল ভিউমডেলের একটি স্ট্রিং বৈশিষ্ট্য যা পরবর্তী সাজানোর দিকটি ধরে রাখে। যেটি ব্যবহারের ক্ষেত্রে দৃa়ভাবে ব্যবহৃত হয়।

switch (sortColumn)
{
    case "user_name":
        dvm.PagePermissions = Sort(dvm.PagePermissions, p => p.user_name, ref sortDir);
        dvm.UserNameSortDir = sortDir;
        break;
    case "role_name":
        dvm.PagePermissions = Sort(dvm.PagePermissions, p => p.role_name, ref sortDir);
        dvm.RoleNameSortDir = sortDir;
        break;
    case "page_name":
        dvm.PagePermissions = Sort(dvm.PagePermissions, p => p.page_name, ref sortDir);
        dvm.PageNameSortDir = sortDir;
        break;
}                 


public List<T> Sort<T,TKey>(List<T> list, Func<T, TKey> sorter, ref string direction)
    {
        if (direction == "asc")
        {
            list = list.OrderBy(sorter).ToList();
            direction = "desc";
        }
        else
        {
            list = list.OrderByDescending(sorter).ToList();
            direction = "asc";
        }
        return list;
    }

1
আমি মনে করি এটি বেশ জটিল। আপনি অন্যান্য উত্তরগুলিতে যেমন দেখতে পাচ্ছেন, এটি সবগুলি একটি একক লাইনেই করা যায় (এটির অর্থ এই নয় যে এটি একটি এক লাইনে করা ভাল, তবে আমি এটির মতো করে লাভ করি না)
21

এটি AngularJS ব্যবহার করে বহু কলাম সাজানোর জন্য। এটি মূলত একক লাইন বাছাই করা হয় তবে এটি বাছাইয়ের দিক পরিবর্তনকেও সেট করে। আপনি যদি ঘনিষ্ঠভাবে তাকান তবে এটি সত্যিই জটিল নয়। আমার ধারণা, বাছাই করা ফাংশনটি সমস্ত জেনেরিক স্টাফের সাথে কিছুটা ভয় দেখানো তবে আমি যদি সেই সংজ্ঞাটি গ্রহণ করি তবে এটি একটি 1 লাইন বাছাই কল।
হাউসাররা

ওপি যা অনুরোধ করেছিল তার জন্য খুব জটিল। যদিও এটি একটি ভিন্ন সমস্যার জন্য ভাল সমাধান।
রোলগুলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.