Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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:对没有第一行的行进行排序_C#_Linq - Fatal编程技术网

C# Linq:对没有第一行的行进行排序

C# Linq:对没有第一行的行进行排序,c#,linq,C#,Linq,从下面的代码中,我将按第一列对行进行排序。如何通过跳过第一行对其进行排序 var Rows = (from row in datatable.AsEnumerable() orderby row[0] ascending select row); 注意:我只想通过考虑第一列对行进行排序。请不要考虑名字和城市栏目。说出姓名和城市不在场 原始表格 ID Name

从下面的代码中,我将按第一列对行进行排序。如何通过跳过第一行对其进行排序

 var Rows = (from row in datatable.AsEnumerable()
            orderby row[0] ascending                            
            select row);
注意:我只想通过考虑第一列对行进行排序。请不要考虑名字和城市栏目。说出姓名和城市不在场

原始表格

ID             Name                     City
----------- --------------------------------
3             Vijendra                  Delhi
2             Singh                     Noida
1             Shakya                    New Delhi
5             Shakya                    New Delhi
4             Shakya                    New Delhi
当前O/p

ID             Name                     City
----------- --------------------------------
1             Shakya                    New Delhi
2             Singh                     Noida
3             Vijendra                  Delhi
4             Shakya                    New Delhi
5             Shakya                    New Delhi
预期O/p

ID             Name                     City
----------- --------------------------------
3             Vijendra                  Delhi
1             Shakya                    New Delhi
2             Singh                     Noida
4             Shakya                    New Delhi
5             Shakya                    New Delhi

您可以尝试以下逻辑:

var firstId = ...
var Rows = (from row in datatable.AsEnumerable()
            orderby row[0] == firstId descending, row[0] ascending                            
            select row);
另一种选择是使用扩展方法:

public static IEnumerable<T> OrderAfterFirst<T, TKey>(this IEnumerable<T> src,
                                                      Func<T, TKey> keySelector)
{
    // Ensure you don't throw or return null or whatever if the collection is empty
    foreach (var first in src.Take(1))
    {
        yield return first;
    }

    // Return the rest of the elements ordered
    foreach (var x in src.Skip(1).OrderBy(keySelector))
    {
        yield return x;
    }
}

您必须使用多个order by条件

var Rows = datatable.AsEnumerable().OrderBy(x => x.Name )
             .ThenByDescending(x => x.City )
             .ToList();
您还可以使用查询语法并说:

var Rows = (from row in datatable.AsEnumerable()
       orderby row .Name , row.City descending
       select row ).ToList();

可以按布尔值排序,例如使用条件运算符:

var Rows = from row in datatable.AsEnumerable()
           let id = row.Field<int>(0)
           orderby id == 3 ? 0 : 1 ascending, id ascending                  
           select row;
即使这对我来说没有多大意义,如果您想始终保持第一行在顶部,无论内容是什么,您都可以使用Object.ReferenceEquals:


只需对除第一行以外的所有内容进行排序,然后将其与第一行合并:

var data = datatable.AsEnumerable();
var firstRow = data.Take(1);
var sorted = data.Skip(1).OrderBy(row=>row[0]);
var rows = firstRow.Concat(sorted);
或作为一项声明:

var rows = data.Take(1).Concat(data.Skip(1).OrderBy(row=>row[0]));

如果您使用列表,应该很容易:

        var newList = new List<DataRow>(){originalList.First()};
        newList.AddRange(originalList.Where(x => x.row[0] != originalList.First().row[0]).OrderBy(x => x.row[0]));

这里的实际排序规则是什么?为什么要特别跳过第一条记录?因此,根据您的更新,我只想通过考虑第一列对行进行排序。请不要考虑名字和城市栏目,那么你要做什么,你需要更具体地解释为什么你想跳过第一条记录。上面的表格只是例子,ID值将是different@Sam:那么我必须重复詹姆斯的问题:这里的实际排序规则是什么?你为什么要跳过第一条记录@山姆:但是,我对我的答案进行了编辑,以提供一种独立于内容的方法。这与我最初的答案是一致的,它仍在编辑框中,但我没有发布,因为我认为如果OP可以更具体地说明其排序规则,他们可能可以在一次查询中获得。我不明白为什么需要列表?不需要使用Concat列表就可以轻松完成。它可能有1000种方式。这只是一个答案,我觉得非常简单和优雅。@KrzysztofZagrajek简单,是的,优雅…不太确定。Sriram的答案可能更好,因为它是100%LINQ。@James所说的,当表中没有元素时,这将抛出异常。我不是在批评,不是在暗示那些不知道的人。这是一个如此特殊的情况,我认为扩展方法是不必要的。如果它更通用,可能会更好,例如SkipOrderBy1,x=>x。@James当然,还可以添加订单方向参数,然后通过。。。我只是举了一个简单的例子。是的,但我的观点是,你的扩展方法并不值得作为一个扩展方法,因为它非常特定于一个特定的场景。只是我的观点。@James我的观点是,我的扩展方法将由任何想这样做的人自己编辑和推广,直到他们满意为止。尽管任何扩展方法都可以推广,但问题是我认为扩展方法被误用了……很多,我不喜欢看到答案建议在没有任何价值的情况下使用它。换言之,扩展方法与将其移动到可重用函数相比有什么优势?请记住,扩展方法是针对类型的,而不是内部的数据,因此,如果它不是在任何其他类型的列表中考虑重用的东西,那么它可能不需要是一种扩展方法。
var data = datatable.AsEnumerable();
var firstRow = data.Take(1);
var sorted = data.Skip(1).OrderBy(row=>row[0]);
var rows = firstRow.Concat(sorted);
var rows = data.Take(1).Concat(data.Skip(1).OrderBy(row=>row[0]));
        var newList = new List<DataRow>(){originalList.First()};
        newList.AddRange(originalList.Where(x => x.row[0] != originalList.First().row[0]).OrderBy(x => x.row[0]));