C# ASP.NET:从数据表中筛选唯一行
您好,我正在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
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的回复也很好。使用一行语句我们可以得到输出。