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]));