我今天一直在关注Dynamic Linq(通过NuGet安装到VS中)......但到目前为止我发现的所有示例都假定OrderBy是在已知的属性或列名上完成的;但是我正在尝试OrderBy一个非强类型的字段;但实际上是从Dictionary派生的行对象的键值;例如
class RowValues : Dictionary<string, string>
{
...
}
因此,要排序的列表特别是RowValues对象的列表,其中填充了Name,Value对。对于给定的RowValues列表,OrderBy字段可以通过命名值对的任何键条目(fyi:我希望最终在xml配置文件中指定orderby字段,以便可以在不重新部署二进制文件的情况下更改排序等等)。
我有预感解决方案是编写一个传递给OrderBy的自定义排序函数???这个函数显然知道如何从给定xml配置中的字段名称的RowValues对象中获取特定值。到目前为止我看到的答案显示将一个包含自定义order by子句的字符串传递给OrderBy,它接近我想要的位置,但在我的情况下,运行时如何知道在哪里找到在OrderBy string ??
非常感谢输入,还是我完全误解了动态Linq功能?
答案 0 :(得分:0)
如果您使用的是动态LINQ,那就是:
var sortColumn = GetConfigValue(...);
var sorted = RowValues.OrderBy(sortColumn);
您当然可以使用连接字符串来创建多重排序("column1, column2 DESC"
)。据我所知,除非你使用常规LINQ,否则没有自定义排序功能。
另外,我会确保您了解Dynamic LINQ的性能特征。
编辑:
这是你要找的吗?这将根据字典中“Key”条目的值对其进行排序。如果您需要按-s进行多次排序,则可以在.ThenBy()
void Main()
{
List<RowValues> v = new List<RowValues>();
var key = "Key"; //GetFromConfig();
var v1 = new RowValues();
v1.Add("Key", "1");
v1.Add("3", "5");
var v2 = new RowValues();
v2.Add("Key", "3");
v2.Add("2", "2");
var v3 = new RowValues();
v3.Add("Key", "2");
v3.Add("2", "2");
v.Add(v1);
v.Add(v2);
v.Add(v3);
v.OrderBy(r => r[key]).Dump();
}
class RowValues : Dictionary<string, string>
{
}
答案 1 :(得分:-1)