Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.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# 林克问题_C#_Linq - Fatal编程技术网

C# 林克问题

C# 林克问题,c#,linq,C#,Linq,我有一个数据表,我想从结果中选择所有不同的名称。我为它编写了以下linq查询 var distinctRows = (from DataRow myDataRow in myDataTable.Rows select new { col1 = myDataRow ["Name"]}).Distinct(); 现在我如何迭代distinctRows?似乎我无法在distinctRows中执行foreachDataRow行,这会导致我无法将类型“Anony

我有一个数据表,我想从结果中选择所有不同的名称。我为它编写了以下linq查询

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,谢谢你指出。很抱歉使用了愚蠢的标题: