在 dt.AsEnumerable() 中使用 from DataRow dRow 在 C# .NET 中创建不同的有序列表

Posted

技术标签:

【中文标题】在 dt.AsEnumerable() 中使用 from DataRow dRow 在 C# .NET 中创建不同的有序列表【英文标题】:Using from DataRow dRow in dt.AsEnumerable() to create a distinct ordered list in C# .NET 【发布时间】:2021-07-11 20:58:48 【问题描述】:

我有以下代码,但在如何维护订单方面存在问题:

var cars = (from DataRow dRow in dt.AsEnumerable()
                            select new
                            
                                Car = dRow["Car"],
                                CarId = dRow["CarId"],
                                CarOrder = dRow["CarOrder"]
                            ).Distinct();

distinct 效果很好,但我需要保留从 1 到 X(升序)的 CarOrder。

DataTable dt 将它们全部按正确顺序排列,但是当它遇到这个不同的代码时,顺序不会被保留。

我正在尝试弄清楚如何使用 OrderBy 子句。

【问题讨论】:

我不明白这个问题。您在使用OrderBy()(或查询语法order by)时遇到问题?怎么了?您现有的代码不保证任何顺序。 如何在具有 Distinct 的 CarOrder 上使用 OrderBy?我不确定如何使用它。 您在 Distinct 通话后添加 .OrderBy。你知道 OrderBy 是如何工作的吗? 我认为您需要回去了解 LINQ 的工作原理。您不能将字符串参数传递给 OrderBy。请阅读on how it works。你的声誉是我的两倍,所以我希望你已经做到了这一点。 这能回答你的问题吗? LINQ : Distinct and Orderby 【参考方案1】:

根据docs

它返回源中唯一项的无序序列

这意味着订单不会得到保留。所以你可以做的可能是OrderBy()Distinct() 之后如下:

var cars = (from DataRow dRow in dt.AsEnumerable()
            select new
            
                Car = dRow["Car"],
                CarId = dRow["CarId"],
                CarOrder = dRow["CarOrder"]
            ).Distinct().OrderBy(x => x.CarOrder);

见:Does Distinct() method keep original ordering of sequence intact?

【讨论】:

以上是关于在 dt.AsEnumerable() 中使用 from DataRow dRow 在 C# .NET 中创建不同的有序列表的主要内容,如果未能解决你的问题,请参考以下文章

var query = dt.AsEnumerable().ToList().Where(o => o.Field<string>("CampaignName")

DataTable中某数字列数据相加

C# 中的GetEnumerator方法,C# DataTable几个常用的查询表达式,C#的lINQ怎么用干啥用的

C# 两个datatable中的数据快速比较返回交集或差集

c#计算datatable中某一列值的和

表中某列的所有值转成List泛型集合