【问题标题】:How to select distinct rows in a datatable and store into an array如何在数据表中选择不同的行并存储到数组中
【发布时间】:2010-11-15 00:16:45
【问题描述】:

我有一个数据集 objds。 objds 包含一个名为 Table1 的表。表 1 包含名为 ProcessName 的列。此 ProcessName 包含重复的名称。所以我只想选择不同的名称。这可能吗。

  intUniqId[i] = (objds.Tables[0].Rows[i]["ProcessName"].ToString());

【问题讨论】:

  • 发布示例代码,根据您在下面的评论,答案似乎取决于您正在使用的查询的细节。

标签: c# select datatable distinct


【解决方案1】:
DataView view = new DataView(table);
DataTable distinctValues = view.ToTable(true, "Column1", "Column2" ...);

【讨论】:

  • 如果我有 2 列“mo”和“name”,我需要获取不同的“mo”而不是不同的“name”,但我需要在我的数据表中保留“name”列我可以吗?
  • @JocelyneElKhoury,这真的没有意义......那么你会保留哪个“名称”值?
  • @ThomasLevesque 没关系……假设我需要保留名称的第一个值
  • 好的,那么你需要分组,而不是区分。你可以用 Linq to DataSet 做到这一点:table.AsEnumerable().GroupBy(row => row.Field<int>("mo")).Select(group => group.First()).CopyToDataTable()
【解决方案2】:

单行代码可以避免DataTable的重复行:

dataTable.DefaultView.ToTable(true, "employeeid");

地点:

  • ToTable() 中的第一个参数是 布尔值,表示您是否需要不同的行。

  • ToTable() 中的第二个参数是我们必须选择不同行的列名。只有这些列将在返回的数据表中。

同样可以通过DataSet 访问特定的DataTable 来完成:

dataSet.Tables["Employee"].DefaultView.ToTable(true, "employeeid");

【讨论】:

  • 我最喜欢这个答案,因为它指向 DataTableDefaultView 属性。
  • 如果我需要根据两列来区分怎么办?
  • @Lijo,ToTable(boolean, params string[] columnNames) 方法允许指定多个列。
【解决方案3】:
DataTable dt = new DataTable();
dt.Columns.Add("IntValue", typeof(int));
dt.Columns.Add("StringValue", typeof(string));
dt.Rows.Add(1, "1");
dt.Rows.Add(1, "1");
dt.Rows.Add(1, "1");
dt.Rows.Add(2, "2");
dt.Rows.Add(2, "2");

var x = (from r in dt.AsEnumerable()
        select r["IntValue"]).Distinct().ToList();

【讨论】:

    【解决方案4】:

    使用 LINQ(.NET 3.5、C# 3)

    var distinctNames = ( from row in DataTable.AsEnumerable()
     select row.Field<string>("Name")).Distinct();
    
     foreach (var name in distinctNames ) { Console.WriteLine(name); }
    

    【讨论】:

      【解决方案5】:

      你可以这样使用:

      dataDataTable

      data.DefaultView.ToTable(true, "Id", "Name", "Role", "DC1", "DC2", "DC3", "DC4", "DC5", "DC6", "DC7");  
      

      但性能会下降。尝试使用以下代码:

      data.AsEnumerable().Distinct(System.Data.DataRowComparer.Default).ToList();  
      

      为了表现; http://onerkaya.blogspot.com/2013/01/distinct-dataviewtotable-vs-linq.html

      【讨论】:

      • 第二个答案超快!
      【解决方案6】:
      var distinctRows = (from DataRow dRow in dtInventory.Rows
                                      select dRow["column_name"] ).Distinct();
      
      var distinctRows = (from DataRow dRow in dtInventory.Rows
                                      select dRow["col1"], dRow["col2"].. ).Distinct();
      

      【讨论】:

      • @Adi Lester:也许选择新的 { col1 = dRow["col1"], col2 = dRow["col2"], ...} ).Distinct();更正确?
      • 当你只有一个 List 你可以这样做: var test = (from DataRow dRow in vm.LiveAssets select dRow["manname"]).Distinct();
      • 第一行有效。第二个,正如 Urik 指出的那样,但 Urik 也不起作用,因为 Distinct() 在对匿名类型进行对象比较时不会找到相等性。
      【解决方案7】:

      为了改进上述答案:dataview 上的 ToTable 函数有一个“distinct”标志。

      //This will filter all records to be distinct
      dt = dt.DefaultView.ToTable(true);
      

      【讨论】:

      • 这似乎不起作用。只有一个带有不同布尔参数的重载,它需要参数数组。我认为这只会返回一个名为“True”的表,而不应用任何 DISTINCT。
      • +1 这确实有效(至少在 .NET 4.5 中)。如果您将布尔值“True”指定为唯一参数,它将对 DataView 中的所有列执行 DISTINCT。
      • 如果您希望所有列都不同,这非常有效。
      【解决方案8】:

      以下作品。我使用 .NET 3.5 SP1 为我工作

      // Create the list of columns
      String[] szColumns = new String[data.Columns.Count];
      for (int index = 0; index < data.Columns.Count; index++)
      {
          szColumns[index] = data.Columns[index].ColumnName;
      }
      
      // Get the distinct records
      data = data.DefaultView.ToTable(true, szColumns);
      

      【讨论】:

        【解决方案9】:
        string[] TobeDistinct = {"Name","City","State"};
        DataTable dtDistinct = GetDistinctRecords(DTwithDuplicate, TobeDistinct);
        
        //Following function will return Distinct records for Name, City and State column.
        public static DataTable GetDistinctRecords(DataTable dt, string[] Columns)
        {
            DataTable dtUniqRecords = new DataTable();
            dtUniqRecords = dt.DefaultView.ToTable(true, Columns);
            return dtUniqRecords;
        }
        

        【讨论】:

          【解决方案10】:

          语法:-

          DataTable dt = ds.Tables[0].DefaultView.ToTable(true, "ColumnName");
          

          前:-

          DataTable uniqueCols = dsUDFlable.Tables[0].DefaultView.ToTable(true, "BorrowerLabelName");
          

          【讨论】:

            【解决方案11】:

            我碰巧发现了这个: http://support.microsoft.com/default.aspx?scid=kb;en-us;326176#1

            在寻找类似的东西时,仅专门针对 .net 2.0

            我假设 OP 在使用 DataTable.Select() 时正在寻找不同的东西。 (Select() 不支持 distinct)

            所以这是上面链接中的代码:

            class DataTableHelper 
            {
                public DataTable SelectDistinct(string TableName, DataTable SourceTable, string FieldName)
                {   
                    DataTable dt = new DataTable(TableName);
                    dt.Columns.Add(FieldName, SourceTable.Columns[FieldName].DataType);
            
                    object LastValue = null; 
                    foreach (DataRow dr in SourceTable.Select("", FieldName))
                    {
                        if (  LastValue == null || !(ColumnEqual(LastValue, dr[FieldName])) ) 
                        {
                            LastValue = dr[FieldName]; 
                            dt.Rows.Add(new object[]{LastValue});
                        }
                    }
            
                    return dt;
                }
            
                private bool ColumnEqual(object A, object B)
                {
            
                    // Compares two values to see if they are equal. Also compares DBNULL.Value.
                    // Note: If your DataTable contains object fields, then you must extend this
                    // function to handle them in a meaningful way if you intend to group on them.
            
                    if ( A == DBNull.Value && B == DBNull.Value ) //  both are DBNull.Value
                        return true; 
                    if ( A == DBNull.Value || B == DBNull.Value ) //  only one is DBNull.Value
                        return false; 
                    return ( A.Equals(B) );  // value type standard comparison
                }
            }
            

            【讨论】:

              【解决方案12】:
              var ValuetoReturn = (from Rows in YourDataTable.AsEnumerable()
              select Rows["ColumnName"]).Distinct().ToList();
              

              【讨论】:

                【解决方案13】:

                很简单

                    DataView view = new DataView(dt);
                DataTable dt2 = view.ToTable(true, "Column1", "Column2","Column3", ...,"ColumnNth");
                

                和 dt2 数据表包含 column1,Column2..ColumnNth 唯一数据。

                【讨论】:

                  【解决方案14】:

                  最简单的解决方案是使用 LINQ,然后将结果转换为 DataTable

                      //data is a DataTable that you want to change
                      DataTable result = data.AsEnumerable().Distinct().CopyToDataTable < DataRow > ();
                  

                  仅此有效 对于 asp.net 4.0 ^ 框架,它需要 引用 System.Data.DataSetExtensions 正如 Ivan Ferrer Villa 指出的那样

                  【讨论】:

                  • 可能需要引用System.Data.DataSetExtensions
                  【解决方案15】:
                  DataTable dt = new DataTable("EMPLOYEE_LIST");
                  
                  DataColumn eeCode = dt.Columns.Add("EMPLOYEE_CODE", typeof(String));
                  DataColumn taxYear = dt.Columns.Add("TAX_YEAR", typeof(String));
                  DataColumn intData = dt.Columns.Add("INT_DATA", typeof(int));
                  DataColumn textData = dt.Columns.Add("TEXT_DATA", typeof(String));
                  
                  dt.PrimaryKey = new DataColumn[] { eeCode, taxYear };
                  

                  它过滤带有 eecode 和 taxyear 的数据表,结合起来认为是唯一的

                  【讨论】:

                    【解决方案16】:
                    objds.Table1.Select(r => r.ProcessName).AsEnumerable().Distinct();
                    

                    【讨论】:

                    • 嗨@GálGyula,欢迎来到 Stack Overflow!在这里,我们关心的是具有良好解释的答案,而不仅仅是代码。仅在确实解决了问题并且您可以解释如何解决的情况下才发布答案。要改进您未来的答案,请查看指南how do I write a good answer
                    【解决方案17】:
                    DataTable dtbs = new DataTable(); 
                    DataView dvbs = new DataView(dt); 
                    dvbs.RowFilter = "ColumnName='Filtervalue'"; 
                    dtbs = dvbs.ToTable();
                    

                    【讨论】:

                      【解决方案18】:

                      【讨论】:

                      • 对我投反对票的人:S,显然这个问题在我回答后被修改了?? (回答 10:15,问题在 12:15 编辑)哦,好吧.. 谢谢你的无知 :)
                      • OP 询问如何在 C# ado.net 环境中选择不同的行,而不是在实际数据库中。
                      猜你喜欢
                      • 2011-10-10
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2017-04-15
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多