C# 选择distinct from dataTable.AsEnumerable

C# 选择distinct from dataTable.AsEnumerable,c#,linq,datatable,linq-to-dataset,C#,Linq,Datatable,Linq To Dataset,我有一个数据表dtStudent,其结构如下 Id | Name | Class | RoomNum | Subject --------------------------------------- 1 | ABC | 5 | 10 | Maths 1 | ABC | 5 | 10 | Science 1 | ABC | 5 | 10 | English 如您所见,它仅包含主题列的不同数据 现在,我想获取class和RoomN

我有一个数据表dtStudent,其结构如下

Id | Name | Class | RoomNum | Subject
---------------------------------------
1  | ABC  | 5     | 10      | Maths
1  | ABC  | 5     | 10      | Science
1  | ABC  | 5     | 10      | English
如您所见,它仅包含主题列的不同数据

现在,我想获取
class
RoomNum
列的值。由于所有行的值都相同,因此我使用以下命令-

var stdDetails = from r in DtTable.AsEnumerable()
select new
    {
        Class = r.Field<string>("Class").ToString(),
        RoomNum = r.Field<string>("RoomNum").ToString()
    };
var stdDetails=来自DtTable.AsEnumerable()中的r
选择新的
{
Class=r.Field(“Class”).ToString(),
RoomNum=r.Field(“RoomNum”).ToString()
};
下一步怎么办?我需要值5和10。有什么帮助吗?

只需添加
Distinct()
调用即可。因此,匿名类型有默认的
Equals
GetHashCode
实现,它们使用它们的所有属性,您将只得到不同的类和房间号对:

var stdDetails = (from r in DtTable.AsEnumerable()
                  select new {
                      Class = r.Field<string>("Class"),
                      RoomNum = r.Field<string>("RoomNum")
                  }).Distinct();
var stdDetails=(来自DtTable.AsEnumerable()中的r)
选择新的{
类别=r.字段(“类别”),
RoomNum=r.字段(“RoomNum”)
}).Distinct();
顺便说一句,对于字段的值返回,您不需要调用
ToString()
。它将转换为泛型参数的类型,即在您的情况下转换为字符串。此外,这些列中似乎有整数值,因此请考虑使用
r.Field
将其转换为整数,只需添加
Distinct()
调用即可。因此,匿名类型有默认的
Equals
GetHashCode
实现,它们使用它们的所有属性,您将只得到不同的类和房间号对:

var stdDetails = (from r in DtTable.AsEnumerable()
                  select new {
                      Class = r.Field<string>("Class"),
                      RoomNum = r.Field<string>("RoomNum")
                  }).Distinct();
var stdDetails=(来自DtTable.AsEnumerable()中的r)
选择新的{
类别=r.字段(“类别”),
RoomNum=r.字段(“RoomNum”)
}).Distinct();
顺便说一句,对于字段的值返回,您不需要调用
ToString()
。它将转换为泛型参数的类型,即在您的情况下转换为字符串。此外,这些列中似乎有整数值,因此请考虑使用
r.Field将其转换为整数。您可以使用链接中解释的“Distinct()”函数

您必须选择所需的所有字段,然后应用distinct函数。

您可以使用链接中解释的“distinct()”函数


你必须选择,您需要的所有字段,然后应用distinct函数。

我尝试了它,但出现编译时错误:
“System.Data.EnumerablerRowCollection”不包含“distinct”的定义,并且找不到接受“System.Data.EnumerablerRowCollection”类型的第一个参数的扩展方法“distinct”(是否缺少using指令或程序集引用?)
@MicrosoftDN请确保您的代码文件中使用了
System.Linq
名称空间omg,这是一个愚蠢的错误。它现在可以工作了。但现在我的问题是如何获取值。我知道我可以使用foreach循环来循环并获取它,但因为它只有一个值sfter使用distinct()我不想使用foreach..任何替代方法?@MicrosoftDN您可以使用
First()
仅获取第一个值。但实际上,您不应该知道将有多少不同的数据。否则,您只需使用
DtTable.AsEnumerable().Select(r=>new{Class=…,RoomNum=…).First()
不带distinct@MicrosoftDN您可以使用前面提到的
First()
var result=..First()
然后使用
result.Class
result.RoomNum
我尝试了它,但它给出了编译时错误:
“System.Data.EnumerablerRowCollection”不包含“Distinct”的定义,并且找不到接受“System.Data.EnumerablerRowCollection”类型的第一个参数的扩展方法“Distinct”(是否缺少using指令或程序集引用?)
@MicrosoftDN请确保您的代码文件中使用了
System.Linq
名称空间omg,这是一个愚蠢的错误。它现在可以工作了。但现在我的问题是如何获取值。我知道我可以使用foreach循环来循环并获取它,但因为它只有一个值sfter使用distinct()我不想使用foreach..任何替代方法?@MicrosoftDN您可以使用
First()
仅获取第一个值。但实际上,您不应该知道将有多少不同的数据。否则,您只需使用
DtTable.AsEnumerable().Select(r=>new{Class=…,RoomNum=…).First()
不带distinct@MicrosoftDN您可以使用前面提到的
First()
var result=..First();
然后使用
result.Class
result.RoomNum