如何在数据表中选择不同的行并存储到数组中

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

  intUniqId[i] = (objds.Tables[0].Rows[i]["ProcessName"].ToString());
691611 次浏览
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();
DataView view = new DataView(table);
DataTable distinctValues = view.ToTable(true, "Column1", "Column2" ...);

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

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

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

同时寻找类似的东西,只有,专门为.net 2.0设计的

我假设 OP 在使用 DataTable.Select ()时正在寻找不同的选项(Select ()不支持不同的选项)

下面是来自上面链接的代码:

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
}
}

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

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

地点:

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

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

通过访问特定的 DataTable,从 DataSet也可以做到同样的事情:

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

使用 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); }
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();

下面的工作。我有它为我工作的.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);
var ValuetoReturn = (from Rows in YourDataTable.AsEnumerable()
select Rows["ColumnName"]).Distinct().ToList();

你可以这样用:

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

语法:-

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

例句:-

DataTable uniqueCols = dsUDFlable.Tables[0].DefaultView.ToTable(true, "BorrowerLabelName");
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;
}
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 对数据表进行过滤

DataTable dtbs = new DataTable();
DataView dvbs = new DataView(dt);
dvbs.RowFilter = "ColumnName='Filtervalue'";
dtbs = dvbs.ToTable();

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

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

这只是有效的 就像 Ivan Ferrer Villa 指出的那样,它需要 对 System.Data.DataSetExtended 的引用

很简单

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

和 dt2数据表包含 Column1、 Column2. . ColumnNth 唯一数据。

objds.Table1.Select(r => r.ProcessName).AsEnumerable().Distinct();