C# ASP.NET:从数据表中筛选唯一行

C# ASP.NET:从数据表中筛选唯一行,c#,c#-2.0,C#,C# 2.0,您好,我正在asp.net中使用数据表。我无法获得如何从数据表中筛选唯一数据 问题描述如下 Data Table: Consumer No Date Value ABC001 1st Aug 09 1 ABC001 1st Aug 09 2 ABC001 2nd Aug 09 1 XYZ001 1st Aug 09 1 XYZ002 1st Aug 09 1 XYZ002

您好,我正在asp.net中使用数据表。我无法获得如何从数据表中筛选唯一数据

问题描述如下

Data Table:
Consumer No Date             Value
ABC001           1st Aug 09 1
ABC001           1st Aug 09 2
ABC001           2nd Aug 09 1
XYZ001           1st Aug 09 1
XYZ002           1st Aug 09 1
XYZ002           1st Aug 09 2
我希望根据应用于第一列和第二列的过滤器,获得以下输出。在输出中,我们可以看到第一列和第二列的唯一组合

Consumer No Date             
ABC001           1st Aug 09 
ABC001           2nd Aug 09 
XYZ001           1st Aug 09 
XYZ002           1st Aug 09
如何在数据表上应用筛选器

yourdataset.Tables["TableName"].DefaultView.ToTable(true,"disticecolumn");
创建并返回一个新的数据表 基于现有数据库中的行 数据视图

.ToTable方法中的true指定返回的DataTable包含对其所有列具有不同值的行

从文章

编辑:

从可以使用“distinct”关键字的数据库中执行此操作会更容易。

专用静态数据表SelectDistinct(数据表源表,参数字符串[]字段名)
private static DataTable SelectDistinct(DataTable SourceTable, params string[] FieldNames)
{
     object[] lastValues;
     DataTable newTable;
     DataRow[] orderedRows;

     if (FieldNames == null || FieldNames.Length == 0)
          throw new ArgumentNullException("FieldNames");

     lastValues = new object[FieldNames.Length];
     newTable = new DataTable();

     foreach (string fieldName in FieldNames)
          newTable.Columns.Add(fieldName, SourceTable.Columns[fieldName].DataType);

     orderedRows = SourceTable.Select("", string.Join(", ", FieldNames));

     foreach (DataRow row in orderedRows)
     {
          if (!fieldValuesAreEqual(lastValues, row, FieldNames))
          {
               newTable.Rows.Add(createRowClone(row, newTable.NewRow(), FieldNames));

               setLastValues(lastValues, row, FieldNames);
          }
     }

     return newTable;
}

private static bool fieldValuesAreEqual(object[] lastValues, DataRow currentRow, string[] fieldNames)
{
     bool areEqual = true;

     for (int i = 0; i < fieldNames.Length; i++)
     {
          if (lastValues[i] == null || !lastValues[i].Equals(currentRow[fieldNames[i]]))
          {
               areEqual = false;
               break;
          }
     }

     return areEqual;
}

private static DataRow createRowClone(DataRow sourceRow, DataRow newRow, string[] fieldNames)
{
     foreach (string field in fieldNames)
          newRow[field] = sourceRow[field];

     return newRow;
}

private static void setLastValues(object[] lastValues, DataRow sourceRow, string[] fieldNames)
{
     for (int i = 0; i < fieldNames.Length; i++)
          lastValues[i] = sourceRow[fieldNames[i]];
}
{ 对象值; 数据表新表; DataRow[]orderedRows; if(FieldNames==null | | FieldNames.Length==0) 抛出新ArgumentNullException(“字段名”); lastValues=新对象[FieldNames.Length]; newTable=新数据表(); foreach(字段名中的字符串字段名) newTable.Columns.Add(fieldName,SourceTable.Columns[fieldName].DataType); orderedRows=SourceTable.Select(“,string.Join(“,”,FieldNames)); foreach(orderedRows中的数据行) { 如果(!FieldValuesReequal(lastValues,row,FieldNames)) { newTable.Rows.Add(createRowClone(row,newTable.NewRow(),FieldNames)); setLastValues(lastValues、行、字段名); } } 返回newTable; } 私有静态布尔字段值相等(对象[]lastValues、数据行currentRow、字符串[]字段名) { 布尔等于真; for(int i=0;i

来源:

显然无法对DataTable的Select()方法应用不同的筛选器

但是,您可以使用以下代码行创建新的DataTable:

DataTable filterTable = yourDataTable.DefaultView.ToTable("TargetTable", true, "Consumer", "No", "Date");
这将返回满足您要求的不同行


归功于

您可以使用LINQ执行以下操作:

var resultSet = (from r in dt.AsEnumerable() 
    select r["ConsumerNo"]).Distinct().ToList(); 
看到帖子了吗

最佳Rgds

DataTable filteredTable = yourDataTable.DefaultView.ToTable("TargetTable", true, "Consumer", "No", "Date");

此代码满足了我的要求…谢谢!很多

你就不能绕着它转一圈,去掉重复的部分吗?嗨,不需要再绕一圈了。请阅读菲尼克斯/普里茨的回复。这对我有帮助,但当然!我的谷歌搜索刚好登陆到DevPinoy!嗨,谢谢菲尼克斯和普里茨。我也要感谢你们两位,因为你们成为了我的目的地。再次感谢Hanks ala,phoenix和Preets的回复也很好。使用一行语句我们可以得到输出。