排序& Linq的独特记录

时间:2009-07-01 10:51:35

标签: c# linq

我有像

这样的数据表
public DataTable functiongettable()
{
        DataTable dt = new DataTable();

        dt.Columns.Add("Name");
        dt.Rows.Add("Name1");
        dt.Rows.Add("Name5");
        dt.Rows.Add("Name6");
        dt.Rows.Add("Name3");
        dt.Rows.Add("Name3");
        dt.Rows.Add("Name6");
        dt.Rows.Add("Name3");
        dt.Rows.Add("Name5");
        dt.Rows.Add("Name5");

        return dt;
}

通过使用linq查询,我想执行排序并需要唯一的记录。

我这样做

var query = from c in functiongettable().AsEnumerable().OrderBy("Name").Distinct() select c;

但是得到错误:

无法从用法推断出方法'System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumerable,System.Func)'的类型参数。尝试明确指定类型参数。

如何解决这个问题?

提前致谢

3 个答案:

答案 0 :(得分:2)

尝试在 Distinct 语句中指定 DataRowComparer.Default

<强>更新

排序时使用row.Field(“Name”)

再次更新:

var query = (from c in functiongettable().AsEnumerable()
            orderby c.Field<string>("Name")
            select c).Distinc(DataRowComparer.Default);

答案 1 :(得分:1)

您需要将委托传递给OrderBy,而不是string

试试这个:

        var query = dt.AsEnumerable()
            .OrderBy(dr => dr.ItemArray[0] as string)
            .Distinct(DataRowComparer.Default).Select(dr => dr.ItemArray[0]);

        foreach (var item in query)
        {
            Console.WriteLine(item);
        }

答案 2 :(得分:1)

您不能将String作为OrderBy()中的参数传递。您需要传递身份函数,如下所示:

functiongettable().AsEnumerable().OrderBy(x=>x.Field<string>("Name")).Distinct()

我不认为你会在这里得到明显的结果,因为方法Distinct()将使用TSource的默认相等运算符,在这种情况下它将是DataRow。它不会根据您string列的Name值进行区别选择。