C# C数据集-基于列检索唯一值

C# C数据集-基于列检索唯一值,c#,.net,asp.net-mvc,dataset,return-value,C#,.net,Asp.net Mvc,Dataset,Return Value,我在尝试从csharp中的数据集中检索唯一值时遇到了一些问题,这可能吗 实际上,我正在做这样的事情,从Web服务获取数据集: webService.getInstructions(Username, Password, AppKey).Tables[0].Select(null, "account name asc"); 因此,在本例中,我从帐户中获得了一个按字母顺序排列的列表,但此数据集中有一些重复的行 是否有任何方法可以使此数据集返回具有唯一帐号的值,并按帐号名称的字母顺序进行排序 我想

我在尝试从csharp中的数据集中检索唯一值时遇到了一些问题,这可能吗

实际上,我正在做这样的事情,从Web服务获取数据集:

 webService.getInstructions(Username, Password, AppKey).Tables[0].Select(null, "account name asc");
因此,在本例中,我从帐户中获得了一个按字母顺序排列的列表,但此数据集中有一些重复的行

是否有任何方法可以使此数据集返回具有唯一帐号的值,并按帐号名称的字母顺序进行排序

我想用一些东西代替filterExpression会很好


提前感谢

我个人会将web服务更改为在服务器上进行过滤和排序,以减少带宽需求,可能会返回一个简单的数据类型或自定义类而不是DataTable或任何类似的内容。但是LINQ会做这件事。。。重新阅读问题后更新

var rows = dataset.Tables[0].AsEnumerable()
    .DistinctBy(row => row.Field<string>("account number"))
    .OrderBy(row => row.Field<string>("account name"))
    .ToArray();

我会在数据表上使用一点linq魔法

        DataTable dt = new DataTable();
        dt.Columns.Add(new DataColumn("AccountNumber", typeof(System.Int32)));
        dt.Columns.Add(new DataColumn("AccountName", typeof(System.String)));

        for (int ii = 0; ii < 20; ii++)
            dt.Rows.Add(new object[]{ii, "abc" + ii.ToString()});

        dt.Rows[6][0] = 5;
        dt.Rows[7][0] = 5;
        dt.Rows[8][0] = 5;

        //using grouping to isolate groups with just one item
        var groupedRows =   from row in dt.Select("", "AccountName ASC")
                            group row by row["AccountNumber"] into rowGroup
                            where rowGroup.Count() == 1
                            select rowGroup;

        foreach (var group in groupedRows)
            foreach(DataRow dr in group)
                Console.WriteLine("Account #: {0}  Account name: {1}", dr["AccountNumber"], dr["AccountName"]);


        //using nested select to avoid grouping
        Console.WriteLine();
        Console.WriteLine("Nested select");
        var z = from row in dt.Select()
                where (from x in dt.Select() where (int) x["AccountNumber"] == (int) row["AccountNumber"] select x).Count() == 1
                orderby row["AccountName"]
                select row;

        foreach(DataRow dr in z)
            Console.WriteLine("Account #: {0}  Account name: {1}", dr["AccountNumber"], dr["AccountName"]);


        Console.WriteLine();
        Console.WriteLine("Datatable select");
        var y = from row in dt.Select()
                where (from x in dt.Select("AccountNumber = " + row["AccountNumber"]) select x).Count() == 1
                orderby row["AccountName"]
                select row;

        foreach (DataRow dr in y)
            Console.WriteLine("Account #: {0}  Account name: {1}", dr["AccountNumber"], dr["AccountName"]);

当结果打印到屏幕上时,请注意AccountNumber为“5”的任何行都将丢失,因为它不是唯一的。还请注意,在第一个示例中,我使用了dataTable.Select来进行排序,因为排序是相同的,无论由于不唯一而删除了哪些行。第二个和第三个示例将为您提供一个可直接绑定到的行的IEnumerable列表,第一个示例将为您提供一组包含单个行的组。

谢谢Marc,它工作得非常好,是的,我完全同意您直接在web服务上设置它,但不幸的是,我无法访问它。但是谢谢你的帮助!:
        DataTable dt = new DataTable();
        dt.Columns.Add(new DataColumn("AccountNumber", typeof(System.Int32)));
        dt.Columns.Add(new DataColumn("AccountName", typeof(System.String)));

        for (int ii = 0; ii < 20; ii++)
            dt.Rows.Add(new object[]{ii, "abc" + ii.ToString()});

        dt.Rows[6][0] = 5;
        dt.Rows[7][0] = 5;
        dt.Rows[8][0] = 5;

        //using grouping to isolate groups with just one item
        var groupedRows =   from row in dt.Select("", "AccountName ASC")
                            group row by row["AccountNumber"] into rowGroup
                            where rowGroup.Count() == 1
                            select rowGroup;

        foreach (var group in groupedRows)
            foreach(DataRow dr in group)
                Console.WriteLine("Account #: {0}  Account name: {1}", dr["AccountNumber"], dr["AccountName"]);


        //using nested select to avoid grouping
        Console.WriteLine();
        Console.WriteLine("Nested select");
        var z = from row in dt.Select()
                where (from x in dt.Select() where (int) x["AccountNumber"] == (int) row["AccountNumber"] select x).Count() == 1
                orderby row["AccountName"]
                select row;

        foreach(DataRow dr in z)
            Console.WriteLine("Account #: {0}  Account name: {1}", dr["AccountNumber"], dr["AccountName"]);


        Console.WriteLine();
        Console.WriteLine("Datatable select");
        var y = from row in dt.Select()
                where (from x in dt.Select("AccountNumber = " + row["AccountNumber"]) select x).Count() == 1
                orderby row["AccountName"]
                select row;

        foreach (DataRow dr in y)
            Console.WriteLine("Account #: {0}  Account name: {1}", dr["AccountNumber"], dr["AccountName"]);