C# JSON 轉 物件 並且依照物件陣列的特定屬性 排序 範例

C# JSON 轉 物件 並且依照物件陣列的特定屬性 排序 範例

C# JSON 轉 物件 並且依照物件陣列的特定屬性 排序 範例


資料來源: chatgpt


C#線上編譯: https://dotnetfiddle.net/


01.下列範例是將排序結果獨立成一個全新變數

using System;
using System.Collections.Generic;
using System.Text.Json; // System.Text.Json
using System.Linq;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        string json = @"[
            { ""Name"": ""Alice"", ""Age"": 30 },
            { ""Name"": ""Bob"", ""Age"": 25 },
            { ""Name"": ""Charlie"", ""Age"": 35 }
        ]";

        // 反序列化 JSON 為物件 List<Person>
        List<Person> people = JsonSerializer.Deserialize<List<Person>>(json);
		
	    // 輸出結果
        foreach (var person in people)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }	

		Console.WriteLine("");
			
        // 依照 Age 排序(遞增)  //遞減排序:.OrderByDescending(p => p.Age)
        var sorted = people.OrderBy(p => p.Age).ToList();

        // 輸出結果
        foreach (var person in sorted)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }
    }
}

/*
Alice, 30
Bob, 25
Charlie, 35

Bob, 25
Alice, 30
Charlie, 35
*/


02.如果要改變原本變數要如何實作

using System;
using System.Collections.Generic;
using System.Text.Json;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        string json = @"[
            { ""Name"": ""Alice"", ""Age"": 30 },
            { ""Name"": ""Bob"", ""Age"": 25 },
            { ""Name"": ""Charlie"", ""Age"": 35 }
        ]";

        List<Person> people = JsonSerializer.Deserialize<List<Person>>(json);
	
        // 輸出結果
        foreach (var person in people)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }		

		Console.WriteLine("");
		
        // 就地修改 people 的順序,依照 Age 遞增排序 //如果你要遞減排序,改成 b.Age.CompareTo(a.Age)
        people.Sort((a, b) => a.Age.CompareTo(b.Age));

        // 輸出結果
        foreach (var person in people)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }
    }
}
/*
Alice, 30
Bob, 25
Charlie, 35

Bob, 25
Alice, 30
Charlie, 35
*/


03.先依 Age(年齡)排序(小的在前)&& 再依 Name(姓名)排序(字母序)[複合排序/多重排序]

using System;
using System.Collections.Generic;
using System.Text.Json;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        string json = @"[
            { ""Name"": ""Alice"", ""Age"": 30 },
            { ""Name"": ""Bob"", ""Age"": 25 },
            { ""Name"": ""Charlie"", ""Age"": 30 },
            { ""Name"": ""David"", ""Age"": 25 }
        ]";

        List<Person> people = JsonSerializer.Deserialize<List<Person>>(json);
		
        // 輸出結果
        foreach (var person in people)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }
		
		Console.WriteLine("");
		
        // 就地排序:先依 Age,再依 Name 排序
        people.Sort((a, b) =>
        {
            int ageCompare = a.Age.CompareTo(b.Age);
            if (ageCompare != 0)
                return ageCompare;
            return string.Compare(a.Name, b.Name, StringComparison.Ordinal);
        });

        // 輸出結果
        foreach (var person in people)
        {
            Console.WriteLine($"{person.Name}, {person.Age}");
        }
    }
}
/*
Alice, 30
Bob, 25
Charlie, 30
David, 25

Bob, 25
David, 25
Alice, 30
Charlie, 30
*/

One thought on “C# JSON 轉 物件 並且依照物件陣列的特定屬性 排序 範例

  1. Gemini 使用Linq 來實作排序


    using System;
    using System.Collections.Generic;
    using System.Text.Json;
    using System.Linq;

    public class Person
    {
    public string Name { get; set; }
    public int Age { get; set; }
    public string City { get; set; }
    }

    class Program
    {
    public static void Main(string[] args)
    {
    string jsonString = @"
    [
    { ""Name"": ""Charlie"", ""Age"": 30, ""City"": ""London"" },
    { ""Name"": ""Alice"", ""Age"": 25, ""City"": ""New York"" },
    { ""Name"": ""Bob"", ""Age"": 35, ""City"": ""Paris"" }
    ]";

    // 將 JSON 字串反序列化為 Person 物件的陣列並直接依照 Age 屬性進行排序 (由小到大)
    Person[] sortedPeopleByAgeAscending = JsonSerializer.Deserialize(jsonString)
    ?.OrderBy(p => p.Age)
    .ToArray();

    Console.WriteLine("依照年齡 (由小到大) 排序:");
    if (sortedPeopleByAgeAscending != null)
    {
    foreach (var person in sortedPeopleByAgeAscending)
    {
    Console.WriteLine($"姓名: {person.Name}, 年齡: {person.Age}, 城市: {person.City}");
    }
    }
    else
    {
    Console.WriteLine("JSON 字串反序列化或排序失敗。");
    }

    Console.WriteLine("\n");

    // 將 JSON 字串反序列化為 Person 物件的陣列並直接依照 Age 屬性進行排序 (由大到小)
    Person[] sortedPeopleByAgeDescending = JsonSerializer.Deserialize(jsonString)
    ?.OrderByDescending(p => p.Age)
    .ToArray();

    Console.WriteLine("依照年齡 (由大到小) 排序:");
    if (sortedPeopleByAgeDescending != null)
    {
    foreach (var person in sortedPeopleByAgeDescending)
    {
    Console.WriteLine($"姓名: {person.Name}, 年齡: {person.Age}, 城市: {person.City}");
    }
    }
    else
    {
    Console.WriteLine("JSON 字串反序列化或排序失敗。");
    }

    Console.WriteLine("\n");

    // 將 JSON 字串反序列化為 Person 物件的陣列並直接依照 Name 屬性進行排序 (字母順序)
    Person[] sortedPeopleByName = JsonSerializer.Deserialize(jsonString)
    ?.OrderBy(p => p.Name)
    .ToArray();

    Console.WriteLine("依照姓名 (字母順序) 排序:");
    if (sortedPeopleByName != null)
    {
    foreach (var person in sortedPeopleByName)
    {
    Console.WriteLine($"姓名: {person.Name}, 年齡: {person.Age}, 城市: {person.City}");
    }
    }
    else
    {
    Console.WriteLine("JSON 字串反序列化或排序失敗。");
    }
    }
    }

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *