Cmd*_*len 5 c# linq sorting collections
我有一组List<>需要排序的字典值 (a )。基本上每个字典都是一个“行”,集合是一页行。一个简单的例子;
var data = new List<Dictionary<string,string>>();
data.Add(new Dictionary<string,string>() {
{ "Firstname", "Bob"},
{ "Lastname", "Banana"}
});
data.Add(new Dictionary<string, string>() {
{ "Firstname", "Amy"},
{ "Lastname", "Apple"}
});
data.Add(new Dictionary<string, string>() {
{ "Firstname", "Charlie"},
{ "Lastname", "Coconut"}
});
data.Add(new Dictionary<string, string>() {
{ "Firstname", "Andy"},
{ "Lastname", "Apple"}
});
Run Code Online (Sandbox Code Playgroud)
生成的排序字符串是“SQL”之类的,例如
Lastname asc, Firstname desc
Run Code Online (Sandbox Code Playgroud)
我已经尝试.OrderBy()过数据对象,但这似乎不适用于 KeyValuePairs。
知道如何使用动态排序语句按此顺序对数据列表进行排序:
Apple, Andy
Apple, Amy
Banana, Bob
Coconut, Charlie
Run Code Online (Sandbox Code Playgroud)
如果一些花哨的 LINQ 可以工作,则使用 .NET 4.0。感谢您的任何建议。
data.OrderBy(dict => dict["Lastname"])
.ThenByDescending(dict => dict["Firstname"])
Run Code Online (Sandbox Code Playgroud)
如果是动态的:
var sorted = data.OrderBy(item => 1); // identity (stable) sort
orderby = "Lastname asc, Firstname desc";
foreach (var key in orderby.Split(',').Select(clause => clause.Trim()))
{
if (key.EndsWith(" desc", StringComparison.CurrentCultureIgnoreCase))
{
key = key.Substr(0, key.Length - 5);
sorted = data.ThenByDescending(dict => dict[key]);
} else
{
if (key.EndsWith(" asc", StringComparison.CurrentCultureIgnoreCase))
{
key = key.Substr(0, key.Length - 4);
}
sorted = data.ThenBy(dict => dict[key]);
}
}
Run Code Online (Sandbox Code Playgroud)
private static IEnumerable<Dictionary<string, string>> Sort(IEnumerable<Dictionary<string,string>> data, string orderByString)
{
var orderBy =
orderByString.Split(',').Select(
s => s.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries))
.Select (a => new {Field=a[0],Descending = "desc".Equals (a[1], StringComparison.InvariantCultureIgnoreCase)})
.ToList ();
if (orderBy.Count == 0)
return data;
// First one is OrderBy or OrderByDescending.
IOrderedEnumerable<Dictionary<string, string>> ordered =
orderBy[0].Descending ? data.OrderByDescending (d => d[orderBy[0].Field]) : data.OrderBy (d => d[orderBy[0].Field]);
for (int i = 1; i < orderBy.Count; i++)
{
// Rest are ThenBy or ThenByDescending.
var orderClause = orderBy[i];
ordered =
orderBy[i].Descending ? ordered.ThenByDescending(d => d[orderClause.Field]) : ordered.ThenBy(d => d[orderClause.Field]);
}
return ordered;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11618 次 |
| 最近记录: |