Comment sélectionner des lignes distinctes dans un datatable et stocker dans un tableau
J'ai un ensemble de données objds. objds contient une table nommée Table1. Table1 contient une colonne nommée ProcessName. This ProcessName contains repeated names.So je veux sélectionner seulement distinct names.Is c'est possible.
intUniqId[i] = (objds.Tables[0].Rows[i]["ProcessName"].ToString());
17 réponses
DataView view = new DataView(table);
DataTable distinctValues = view.ToTable(true, "Column1", "Column2" ...);
Suivre une seule ligne de code évitera les lignes en double d'un DataTable
:
dataTable.DefaultView.ToTable(true, "employeeid");
Où:
Le premier paramètre de
ToTable()
est un booléen {[15] } qui indique si vous voulez des lignes distinctes ou non.Le deuxième paramètre du
ToTable()
est le nom de la colonne sur la base duquel nous devons sélectionner des lignes distinctes. Seules ces colonnes seront dans le datatable retourné.
La même chose peut être faite à partir d'un DataSet
, en accédant à un DataTable
:
dataSet.Tables["Employee"].DefaultView.ToTable(true, "employeeid");
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();
Avec 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); }
Vous pouvez utiliser comme ça:
data
est DataTable
data.DefaultView.ToTable(true, "Id", "Name", "Role", "DC1", "DC2", "DC3", "DC4", "DC5", "DC6", "DC7");
Mais la performance sera en baisse. essayez d'utiliser le code ci-dessous:
data.AsEnumerable().Distinct(System.Data.DataRowComparer.Default).ToList();
Pour les performances; http://onerkaya.blogspot.com/2013/01/distinct-dataviewtotable-vs-linq.html
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();
Pour améliorer la réponse ci-dessus: la fonction ToTable sur dataview a un drapeau "distinct".
//This will filter all records to be distinct
dt = dt.DefaultView.ToTable(true);
Travaux suivants. Je l'ai travailler pour moi avec. 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);
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;
}
Je viens de trouver ce qui s'est passé: http://support.microsoft.com/default.aspx?scid=kb; EN-us;326176#1
Tout en recherchant quelque chose de similaire, seulement, spécifiquement pour. net 2.0
Je suppose que L'OP cherchait distinct tout en utilisant DataTable.Sélectionner(). (Select () ne supporte pas distinct)
Voici donc le code du lien ci-dessus:
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
}
}
var ValuetoReturn = (from Rows in YourDataTable.AsEnumerable()
select Rows["ColumnName"]).Distinct().ToList();
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 };
Il filtre la table de données avec eecode et taxyear combinés considérés comme uniques
Syntaxe:-
DataTable dt = ds.Tables[0].DefaultView.ToTable(true, "ColumnName");
EX: -
DataTable uniqueCols = dsUDFlable.Tables[0].DefaultView.ToTable(true, "BorrowerLabelName");
La solution la plus simple est d'utiliser linq, puis de transformer le résultat en un DataTable
//data is a DataTable that you want to change
DataTable result = data.AsEnumerable().Distinct().CopyToDataTable < DataRow > ();
Ceci est valide pour asp.net 4.0 ^ cadre si je me rappelle.
C'est facile
DataView view = new DataView(dt);
DataTable dt2 = view.ToTable(true, "Column1", "Column2","Column3", ...,"ColumnNth");
Et DT2 datatable contiennent column1, Column2..ColumnNth données uniques.
Sthing comme ?
SÉLECTIONNEZ DISTINCT .... De la table où condition
Http://www.felixgers.de/teaching/sql/sql_distinct.html
Remarque: Question de devoirs ? et que dieu bénisse google..
DataTable dtbs = new DataTable();
DataView dvbs = new DataView(dt);
dvbs.RowFilter = "ColumnName='Filtervalue'";
dtbs = dvbs.ToTable();