C# 林克问题
我有一个数据表,我想从结果中选择所有不同的名称。我为它编写了以下linq查询C# 林克问题,c#,linq,C#,Linq,我有一个数据表,我想从结果中选择所有不同的名称。我为它编写了以下linq查询 var distinctRows = (from DataRow myDataRow in myDataTable.Rows select new { col1 = myDataRow ["Name"]}).Distinct(); 现在我如何迭代distinctRows?似乎我无法在distinctRows中执行foreachDataRow行,这会导致我无法将类型“Anony
var distinctRows = (from DataRow myDataRow in myDataTable.Rows
select new { col1 = myDataRow ["Name"]}).Distinct();
现在我如何迭代distinctRows?似乎我无法在distinctRows中执行foreachDataRow行,这会导致我无法将类型“AnonymousType1”转换为“System.Data.DataRow”错误这些不是数据行;它们是匿名对象。 要遍历它们,需要使用var关键字声明变量 但是,首先,匿名类型没有意义。
您可以更改查询以选择myDataRow.FieldName以获取一组字符串。这些不是数据行;它们是匿名对象。 要遍历它们,需要使用var关键字声明变量 但是,首先,匿名类型没有意义。 您可以更改查询以选择myDataRow.FieldName以获取一组字符串。这是因为myDataRow[Name]不返回数据行。试一试 这是因为myDataRow[Name]不返回数据行。试一试
因为您只选择了一个字段,所以这里不需要匿名类型。只需选择名称,然后对不同的名称进行迭代。也就是说:
var distinctNames = (from DataRow myDataRow in myDataTable.Rows
select myDataRow.Field<string>("Name")
).Distinct();
foreach(var name in distinctNames) {
Console.WriteLine(name);
}
但是我会根据上面的内容进行更改,因为您不需要匿名类型,而且您的变量名和字段名很差。因为您只选择了一个字段,所以这里不需要匿名类型。只需选择名称,然后对不同的名称进行迭代。也就是说:
var distinctNames = (from DataRow myDataRow in myDataTable.Rows
select myDataRow.Field<string>("Name")
).Distinct();
foreach(var name in distinctNames) {
Console.WriteLine(name);
}
但是我会根据上面的内容进行更改,因为您不需要匿名类型,而且您的变量名和字段名很差。您可以使用关键字var来引用匿名类型,这就是您要返回的IEnumerable of
但是,由于您只返回带有一个字符串属性的匿名类型,因此您也可以投影IEnumerable,您可以使用关键字var来引用您要返回IEnumerable的匿名类型
但是,由于您只返回带有一个字符串属性的匿名类型,因此还可以投影IEnumerable,这是因为返回值不是DataRow。它是一种特殊类型,包含属性col1。这是因为返回值不是DataRow。它是一种特殊类型,包含属性col1。以SLaks answer为基础构建
var distinctRows = (from DataRow myDataRow in myDataTable.Rows
select new { col1 = myDataRow ["Name"]}).Distinct();
foreach(var row in distinctRows)
{
System.Console.Writeline(row.col1); //should work fine
}
建立在渣上的答案
var distinctRows = (from DataRow myDataRow in myDataTable.Rows
select new { col1 = myDataRow ["Name"]}).Distinct();
foreach(var row in distinctRows)
{
System.Console.Writeline(row.col1); //should work fine
}
这里的问题是,您正在通过选择新的{col1=myDataRow[Name]}而不是实际的行本身来选择一个新的匿名类型。因此,当您尝试将其作为DataRow进行迭代时,它将出错,因为您选择的匿名类型不是DataRow类型 如果您希望能够选择整个数据行,而不仅仅是名称字段,则需要实现一个自定义数据行以传递给Distinct扩展方法 例如:
public class NameComparer : IEqualityComparer<DataRow>
{
public bool Equals(DataRow left, DataRow right)
{
return left.Field<string>("Name").Equals(right.Field<string>("Name"));
}
public int GetHashCode(DataRow obj)
{
return obj.ToString().GetHashCode();
}
}
这里的问题是,您正在通过选择新的{col1=myDataRow[Name]}而不是实际的行本身来选择一个新的匿名类型。因此,当您尝试将其作为DataRow进行迭代时,它将出错,因为您选择的匿名类型不是DataRow类型 如果您希望能够选择整个数据行,而不仅仅是名称字段,则需要实现一个自定义数据行以传递给Distinct扩展方法 例如:
public class NameComparer : IEqualityComparer<DataRow>
{
public bool Equals(DataRow left, DataRow right)
{
return left.Field<string>("Name").Equals(right.Field<string>("Name"));
}
public int GetHashCode(DataRow obj)
{
return obj.ToString().GetHashCode();
}
}
您也可以访问它们,但首先必须按以下方式列出它们:
List<string> rslt =(from DataRow myDataRow in myDataTable.Rows
select new { col1 = myDataRow ["Name"].ToString()}).Distinct().ToList();
foreach(string str in rlst)
{}
希望这对您有所帮助,您也可以访问它们,但首先您必须将它们列为以下内容:
List<string> rslt =(from DataRow myDataRow in myDataTable.Rows
select new { col1 = myDataRow ["Name"].ToString()}).Distinct().ToList();
foreach(string str in rlst)
{}
希望这有帮助你为什么需要一个例子?如果你真的读到了错误,解决方法应该是显而易见的。为什么你需要一个例子?如果你真的读到了错误,解决方法应该是显而易见的。将来,如果问题的标题描述了你的问题,你可能会得到更好的结果。林肯的问题什么也没告诉我们;C和linq已经是标签了,我们知道这是个问题。@Eric,谢谢你指出。抱歉使用了愚蠢的标题:将来,如果问题的标题描述了你的问题,你可能会得到更好的结果。林肯的问题什么也没告诉我们;C和linq已经是标签了,我们知道这是个问题。@Eric,谢谢你指出。很抱歉使用了愚蠢的标题: