C# - Windows应用商店应用 - 如何对List <jsonobject>进行排序?</jsonobject>

时间:2014-04-09 10:46:18

标签: c# .net list sorting windows-store-apps

我的应用有List<T> JsonObject个,我希望能够对它们进行排序。

我的JsonObject来自与

类似的内容
{
"firstName": "John",
"lastName": "Smith",
"isAlive": true,
"age": 25,
"height_cm": 167.64,
"address": {
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021-3100"
},
"phoneNumbers": [
    { "type": "home", "number": "212 555-1234" },
    { "type": "fax",  "number": "646 555-4567" }
]
}

我对C#和.NET相当新,并开始编写排序算法

        public  List<JsonObject> SortAgeAsc(List<JsonObject> data)
        {
            List<JsonObject> sorted = new List<JsonObject>();
            // Iterate through each object and sort into age order
            foreach(JsonObject jo in data)
            {
                bool added = false;
                for(int i = 0; i < sorted.Count; i++)
                {
                    // If our data object has a lower age then the current sorted object, add it in its place.
                    if(jo.GetNamedNumber("age") <= sorted.ElementAt(i).GetNamedNumber("age"))
                    {
                        sorted.Insert(i, jo);
                        added = true;
                        break;
                    }
                }
                // If we are yet to add it, it must be the oldest so far. 
                if (!added)
                    sorted.Add(jo);
            }
            return sorted;
        }

注意:请不要评论这是否有效,因为这超出了本问题的范围。

然后我开始阅读List<T>.Sort()并认为必须使用它而不是自己编写排序算法,因为我希望它是一种有效的排序方法。

我遇到的大多数示例都使用类属性进行排序。有没有办法我可以在特定的json密钥上对List<JsonObject>进行排序(例如&#34; age&#34;在我上面的示例中)?

2 个答案:

答案 0 :(得分:2)

你可以使用 OrderBy

这样做
var sorted = data.OrderBy(x=>x.age).ToList();

答案 1 :(得分:0)

管理自己解决。

要排序任何List(而不是排序列表),您需要有IComparer接口,因此Sort()方法可以在{{1}的两个实例上调用compare }}

Type是键值对的列表,其中值可以是一个6个不同的JsonObject(bool,数字,字符串,JsonObject,null,数组)。因此,在进行比较时,您需要考虑这一事实并处理任何类型不匹配的实例。

这是一个JsonValueType,可以对应该将数字作为值的键排序IComparer

List<JsonObject>

这就是你在原始问题中使用它的方法。

    /// <summary>
    /// A comparere class for sorting JsonObject lists on given key
    /// number values. Ascending.
    /// </summary>
    private class NumberComparerAsc : IComparer<JsonObject>
    {
        private string key;
        public NumberComparerAsc(string key)
        {
            this.key = key;
        }

        public int Compare(JsonObject x, JsonObject y)
        {
            int result = -1;
            IJsonValue xValue = null;
            IJsonValue yValue = null;
            x.TryGetValue(key, out xValue);
            y.TryGetValue(key, out yValue);

            if (xValue != null && yValue != null)
            {
                // If they are both number do a compare.
                if (xValue.ValueType == JsonValueType.Number && yValue.ValueType == JsonValueType.Number)
                {
                    result = xValue.GetNumber().CompareTo(yValue.GetNumber());
                }
                else
                {
                    // If x is a number, it is less they y.
                    if (xValue.ValueType == JsonValueType.Number)
                    {
                        result = -1;
                    }
                    // If y is a number, x is greater then y
                    else if (y.ValueType == JsonValueType.Number)
                    {
                        result = 1;
                    }
                    // If neither are a number they are equal
                    else
                    {
                        result = 0;
                    }
                }
            }
            else
            {
                if (xValue == null)
                {
                    // x is less then y.
                    result = -1;
                }
                else if (yValue == null)
                {
                    // x is greater then y.
                    result = 1;
                }
                else
                {
                    // x and y are equal
                    result = 0;
                }
            }
            return result;
        }
    }

这将在“年龄”键上将列表排序为升序数字顺序。如果任何具有密钥“age”的值不是... List<JsonObject> users = GetUsers(); users.Sort(new NumberComparerAsc("age")) ... 的那么,那么它们将在列表的底部以它们已经在列表中的顺序排列。