ฉันจะจัดเรียงรายการทั่วไป DESC และ ASC ได้อย่างไร


110

ฉันจะจัดเรียงรายการทั่วไป DESC และ ASC ได้อย่างไร ด้วย LINQ และไม่มี LINQ? ฉันใช้ VS2008

class Program
{
    static void Main(string[] args)
    {
        List<int> li = new List<int>();

        li.Add(456);
        li.Add(123);
        li.Add(12345667);
        li.Add(0);
        li.Add(1);

        li.Sort();

        foreach (int item in li)
        {
            Console.WriteLine(item.ToString() + "\n");
        }

        Console.ReadKey();
    }
}

คำตอบ:


246

กับ Linq

var ascendingOrder = li.OrderBy(i => i);
var descendingOrder = li.OrderByDescending(i => i);

ไม่มี Linq

li.Sort((a, b) => a.CompareTo(b)); // ascending sort
li.Sort((a, b) => b.CompareTo(a)); // descending sort

โปรดทราบว่าหากไม่มี Linq รายการจะถูกจัดเรียง ด้วย Linq คุณจะได้รับคำสั่งแจกแจงรายการ แต่ตัวรายการเองก็ไม่เปลี่ยนแปลง หากคุณต้องการเปลี่ยนรายการคุณจะต้องเปลี่ยนวิธีการ Linq เป็นอย่างอื่น

li = li.OrderBy(i => i).ToList();

1
@oneday เมื่อคุณรู้สึกว่าคำตอบของผู้ใช้รายอื่นไม่ถูกต้องคุณควรแสดงความคิดเห็นโหวตและ / หรือให้คำตอบที่คุณรู้สึกว่าถูกต้องไม่ใช่แก้ไขคำตอบของบุคคลอื่นให้เป็นสิ่งที่คุณคิดว่าถูกต้อง
Servy

24
ผมคิดว่าสำหรับลำดับถัดลงมามันเป็นที่ชัดเจนมากขึ้นกับการใช้งานli.Sort((a, b) => b.CompareTo(a));กว่า-1*วิธีการใช้ที่นี่ ฉันแก้ไขคำตอบตามนั้น แต่ @Servy เปลี่ยนกลับ
58

9
@oneday เมื่อผู้เขียนทำผิดพลาดในการเขียนสิ่งที่พวกเขาตั้งใจจะเปลี่ยนให้เป็นสิ่งที่พวกเขาตั้งใจจะเขียนก็ไม่เป็นไร การเปลี่ยนรูปแบบรหัสสิ่งที่คนอื่นคิดว่าวิธีแก้ปัญหาควรใช้วิธีการอื่นที่คุณคิดว่าควรใช้แทนไม่ใช่การแก้ไขที่เหมาะสม
Servy

5
@onedaywhen ชัวร์; คุณจะเห็นทุกที่ที่คุณเห็นคำอธิบายการแก้ไข จากศูนย์ช่วยเหลือ "ฉันควรแก้ไขโพสต์เมื่อใด [... ] เพื่อชี้แจงความหมายของโพสต์ (โดยไม่เปลี่ยนความหมายนั้น)"
Servy

4
หรือเพียงแค่-a.CompareTo(b).
Shimmy Weitzhandler

72

ไม่มี Linq:

จากน้อยไปมาก:

li.Sort();

จากมากไปน้อย:

li.Sort();
li.Reverse();

Sort()เป็นวิธีที่เป็นโมฆะดังนั้นคุณจึงไม่สามารถเชื่อมโยงReverse()กับมันในลักษณะนี้ได้ คุณจะต้องดำเนินการ 2 อย่างแยกกัน อย่างไรก็ตามด้วย LINQ คุณสามารถเชื่อมโยงเข้ากับOrderByแต่ ณ จุดนั้นคุณควรใช้OrderByDescendingแทน
Ahmad Mageed


3

ฉันกำลังตรวจสอบคำตอบทั้งหมดข้างต้นและต้องการเพิ่มข้อมูลเพิ่มเติม ฉันต้องการจัดเรียงรายการตามลำดับ DESC และฉันกำลังค้นหาโซลูชันซึ่งเร็วกว่าสำหรับอินพุตที่ใหญ่กว่าและฉันใช้วิธีนี้ก่อนหน้านี้: -

li.Sort();
li.Reverse();

แต่กรณีทดสอบของฉันล้มเหลวเนื่องจากเกินขีด จำกัด เวลาดังนั้นวิธีแก้ปัญหาด้านล่างจึงเหมาะสำหรับฉัน: -

li.Sort((a, b) => b.CompareTo(a));

สรุปได้ว่าวิธีที่ 2 ของรายการเรียงลำดับจากมากไปหาน้อยนั้นเร็วกว่าวิธีก่อนหน้าเล็กน้อย


-3

วิธีที่ง่ายมากในการจัดเรียงรายการด้วยค่า int ในลำดับจากมากไปหาน้อย:

li.Sort((a,b)=> b-a);

หวังว่านี่จะช่วยได้!


4
นี่ไม่ใช่int.CompareTo(int)เหตุผลของประตู ดูแหล่งที่มาที่ referencesource.microsoft.comซึ่งระบุว่า: " ต้องใช้การเปรียบเทียบเนื่องจากการลบจะรวมเป็นค่าบวกสำหรับจำนวนลบที่มีขนาดใหญ่มากเป็นต้น " หากคุณมีb = int.MinValueและa = 1(พูด) สิ่งนี้จะล้มเหลว บางครั้งการเรียกวิธีการก็คุ้มค่า
Wai Ha Lee

คำถามกล่าวเกี่ยวกับการเรียงลำดับรายการทั่วไป การดำเนินการ "-" จะไม่รวบรวมหลายประเภทด้วยซ้ำ และสำหรับชุดประเภทที่รวบรวมคุณสามารถมีข้อผิดพลาดตัวเลขล้นตามที่กล่าวไว้ในความคิดเห็นก่อนหน้านี้
Vadim Levkovsky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.