我的应用有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;在我上面的示例中)?
答案 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"))
...
的那么,那么它们将在列表的底部以它们已经在列表中的顺序排列。