Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 运行时值上的动态Linq“OrderBy”_C#_.net_Linq_Dynamic - Fatal编程技术网

C# 运行时值上的动态Linq“OrderBy”

C# 运行时值上的动态Linq“OrderBy”,c#,.net,linq,dynamic,C#,.net,Linq,Dynamic,我一直在关注今天通过NuGet安装到VS中的Dynamic Linq…但到目前为止,我发现的所有示例都假设OrderBy是在已知的属性或列名上完成的;但是,我尝试按非强类型的字段排序;但实际上是从字典派生的行对象的键值;e、 g class RowValues : Dictionary<string, string> { ... } 因此,要排序的列表是一个RowValues对象的列表,用名称、值对填充。对于给定的RowValues列表,OrderBy字段可以由命名值对条目的任何键

我一直在关注今天通过NuGet安装到VS中的Dynamic Linq…但到目前为止,我发现的所有示例都假设OrderBy是在已知的属性或列名上完成的;但是,我尝试按非强类型的字段排序;但实际上是从字典派生的行对象的键值;e、 g

class RowValues : Dictionary<string, string>
{
...
}
因此,要排序的列表是一个RowValues对象的列表,用名称、值对填充。对于给定的RowValues列表,OrderBy字段可以由命名值对条目的任何键指定。仅供参考:我希望OrderBy字段最终在xml配置文件中指定,以便在不重新部署二进制文件等的情况下更改顺序

我有一种预感,解决方案在于编写一个传递给OrderBy的自定义排序函数???这个函数显然知道如何从xml配置中给定字段名的RowValues对象中获取特定值。。。。??到目前为止,我看到的答案显示将一个包含自定义OrderBy子句的字符串传递到OrderBy中,这接近我想要的位置,但在我的情况下,运行时如何知道在哪里找到OrderBy字符串中引用的字段


非常感谢您的输入,或者我完全误解了动态Linq功能吗?

如果您使用的是动态Linq,那么它只会是:

var sortColumn = GetConfigValue(...);
var sorted = RowValues.OrderBy(sortColumn);
当然,您可以使用连接字符串来创建多个排序column1,column2 DESC。据我所知,除非您使用常规LINQ,否则没有自定义排序函数

另外,我会确保您了解动态LINQ的性能特征

编辑:

这就是你要找的吗?这将根据字典中键条目的值对其进行排序。如果需要多个排序方式,可以在循环中使用它,然后使用.ThenBy


凯尔,再次感谢你。很抱歉回复太晚,我现在已经离开了这个问题,但出于兴趣和礼貌,我想回来并同意您的代码更接近我想要达到的目的,但我们已经失去了动态linq方面。因此,当您调用OrderBy并对键进行排序时,我希望传递一个包含order命令的字符串,例如r[key]desc。原因是我希望在运行时才确定要排序的方向。我怀疑这可能是通过使用表达式树来实现的?e、 g:

感谢您的回答Kyle:-但是,我在解决方案中对您的代码的解释导致了异常,因为运行时无法在行中找到与指定排序列名匹配的属性。这是因为行本身只是字典派生的对象。这让我回到了我最初的问题:将动态linq语法应用于键、值对的行,而不是映射到列的具体属性名。我认为我对这个问题的解释不太好,我已经找到了一个解决方案,我会尽快写出来并发布。@Toadafather让我知道第二个代码是否是您要找的。我认为你的解释也不好;,但我认为我们可以找到问题的根源。@Toadafather我不知道这是什么意思。请参阅下面的答案,尽管我认为由于使用了“谢谢”一词,它曾被某个mod删除过一次。请不要将“谢谢”添加为答案。一旦你有足够的资源,你将能够找到你认为有用的东西。好的,事情就是这样。我想添加感谢作为注释,但我不知道如何在注释中获得代码标记格式,因为我的回复中包含了一行代码,我想显示格式良好的代码,所以我创建了一个答案。我在《帮助指南》中看到,这不是推荐的做法,很好,但如何回复答案并包括代码格式?RowValues.OrderByr[key]+desc?如果您唯一的问题是希望将订单保存到运行时,我将使用If语句并执行OrderBy或OrderByDescending。它会更快,也更容易维护。此外,在回复某人的评论时,请确保包括@[用户名],例如@Toadfather。
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>
{

}