Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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和order by_C#_.net_Linq_Lambda - Fatal编程技术网

C# Linq和order by

C# Linq和order by,c#,.net,linq,lambda,C#,.net,Linq,Lambda,我有一个泛型类,它可以使用泛型OrderBy参数 课程安排如下 class abc<T> where T : myType { public abc(....., orderBy_Argument ){ ... } void someMethod(arg1, arg2, bool afterSort = false) { IEnumerable<myType> res ; if ( afterSort &&

我有一个泛型类,它可以使用泛型OrderBy参数

课程安排如下

 class abc<T> where T : myType
 {
   public abc(....., orderBy_Argument ){ ... }
   void someMethod(arg1, arg2, bool afterSort = false)
   {
       IEnumerable<myType> res ;
       if ( afterSort && orderBy_Argument != null )
          res = src.Except(tgt).OrderBy( .... );
       else
          res = src.Except(tgt);
   }
}
我们的目标是通过一个参数来创建order,而不是将其嵌入


有什么想法吗?

只需作为代理传递排序键:

 class abc<T, TSort> where T : myType
 {
   public abc(....., Func<T, TSort> sortKeySelector ){ ... }
   void someMethod(arg1, arg2, bool afterSort = false)
   {
       IEnumerable<myType> res ;
       if ( afterSort && sortKeySelector != null )
          res = src.Except(tgt).OrderBy(sortKeySelector);
       else
          res = src.Except(tgt);
   }
}
abc类,其中T:myType
{
公共abc(…,Func sortKeySelector){…}
void someMethod(arg1、arg2、bool afterSort=false)
{
可数名词;
if(afterSort&&sortKeySelector!=null)
res=src.Except(tgt).OrderBy(sortKeySelector);
其他的
res=src.除外(tgt);
}
}
缺点是它需要一个额外的类型参数…

不要在转换
IEnumerable
(或
IQueryable
)的函数中将参数传递给
OrderBy

修改示例以执行此操作将导致以下程序:

using System;
using System.Collections.Generic;
using System.Linq;

class abc<T>  {
    Func<IEnumerable<T>,IEnumerable<T>> sorter;
    public abc(Func<IEnumerable<T>,IEnumerable<T>> sorter) {
        this.sorter=sorter ?? (x=>x);
    }
    public void someMethod(IEnumerable<T> src, bool afterSort = false) {
        var res= (afterSort?sorter:x=>x) (src.Skip(5).Take(10));

        Console.WriteLine(string.Join(", ",res.Select(el=>el.ToString()).ToArray()));
    }
}

public class Program {
    static void Main()    {
        var strs = Enumerable.Range(0,1000).Select(i=>i.ToString());

        var myAbc = new abc<string>(
            xs=>xs.OrderByDescending(x=>x.Length).ThenByDescending(x=>x.Substring(1))
        );

        myAbc.someMethod(strs);      //5, 6, 7, 8, 9, 10, 11, 12, 13, 14
        myAbc.someMethod(strs,true); //14, 13, 12, 11, 10, 5, 6, 7, 8, 9
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
abc班{
Func分拣机;
公共abc(功能分拣机){
这个。分拣机=分拣机??(x=>x);
}
公共方法(IEnumerable src,bool afterSort=false){
var res=(后分拣机:x=>x)(src.Skip(5.Take(10));
Console.WriteLine(string.Join(“,”,res.Select(el=>el.ToString()).ToArray());
}
}
公共课程{
静态void Main(){
var strs=Enumerable.Range(01000).Select(i=>i.ToString());
var myAbc=新abc(
xs=>xs.OrderByDescending(x=>x.Length)。然后是ByDescending(x=>x.Substring(1))
);
myAbc.someMethod(strs);//5,6,7,8,9,10,11,12,13,14
myAbc.someMethod(strs,true);//14、13、12、11、10、5、6、7、8、9
}
}

当然,这是一个非常奇怪的排序,也是一个毫无意义的
someMethod
——但它表明,只需很短的实现,您就可以传递一个非常灵活的排序委托(实际上,该委托可以做的不仅仅是排序)。

可能您可以使用这个著名问题中的某些内容:。马克·格雷威尔有一个很好的答案,他投了很多赞成票。
using System;
using System.Collections.Generic;
using System.Linq;

class abc<T>  {
    Func<IEnumerable<T>,IEnumerable<T>> sorter;
    public abc(Func<IEnumerable<T>,IEnumerable<T>> sorter) {
        this.sorter=sorter ?? (x=>x);
    }
    public void someMethod(IEnumerable<T> src, bool afterSort = false) {
        var res= (afterSort?sorter:x=>x) (src.Skip(5).Take(10));

        Console.WriteLine(string.Join(", ",res.Select(el=>el.ToString()).ToArray()));
    }
}

public class Program {
    static void Main()    {
        var strs = Enumerable.Range(0,1000).Select(i=>i.ToString());

        var myAbc = new abc<string>(
            xs=>xs.OrderByDescending(x=>x.Length).ThenByDescending(x=>x.Substring(1))
        );

        myAbc.someMethod(strs);      //5, 6, 7, 8, 9, 10, 11, 12, 13, 14
        myAbc.someMethod(strs,true); //14, 13, 12, 11, 10, 5, 6, 7, 8, 9
    }
}