使用控制语句键入推断

时间:2009-11-11 20:42:40

标签: c#

var sortQ = filterQ;  // <--- update

if (iSortingCols > 0)
{
    sortQ = (sortDirs[0] == "asc") ?
        sortQ.OrderBy((d) => d.GetColumnData()[sortCols[0]]) :
        sortQ.OrderByDescending((d) => d.GetColumnData()[sortCols[0]]);

    if (iSortingCols > 1)
    {
        for (int i = 1; i < iSortingCols; i++)
        {
            sortQ = (sortDirs[i] == "asc") ?
                sortQ.ThenBy(d => d.GetColumnData()[sortCols[i]]) :
                sortQ.ThenByDescending(d => d.GetColumnData()[sortCols[i]]);

        }
     }
 }

编译器在for循环中强调了三元运算符的两个结果,称IEnumerable&lt; ...&gt;没有名为ThenBy的方法重载(类似于ThenByDescending),但sortQ将是IOrderedEnumerable&lt; ...&gt;在那个街区。为什么C#类型的推断没有捡到它?

更新:对于那些之前可能感到困惑的人,我从原始代码段中遗漏的是我将sortQ分配给另一个查询的结果,该查询强制类型推理引擎输入sortQ作为一个IEnumerable&lt; ..&gt;,这当然是搞砸了我的例子。下面的答案是解决这个问题的方法。感谢@Marc在各行之间进行阅读。

1 个答案:

答案 0 :(得分:2)

我猜sortQIEnumerable<T>;您需要IOrderedEnumerable<T>才能使用ThenBy;幸运的是,你的第一个OrderBy会返回此信息,所以请抓住它:

var result = (sortDirs[0] == "asc") ?
    sortQ.OrderBy((d) => d.GetColumnData()[sortCols[0]]) :
    sortQ.OrderByDescending((d) => d.GetColumnData()[sortCols[0]]);

if (iSortingCols > 1)
{
    for (int i = 1; i < iSortingCols; i++)
    {
        result = (sortDirs[i] == "asc") ?
            result.ThenBy(d => d.GetColumnData()[sortCols[i]]) :
            result.ThenByDescending(d => d.GetColumnData()[sortCols[i]]);

    }
 }