J'ai un jeu de données objds. objds contient une table nommée Table1. Table1 contient la colonne nommée ProcessName. Ce ProcessName contient des noms répétés.Alors je veux sélectionner uniquement des noms distincts.Est-ce possible.
intUniqId[i] = (objds.Tables[0].Rows[i]["ProcessName"].ToString());
DataView view = new DataView(table);
DataTable distinctValues = view.ToTable(true, "Column1", "Column2" ...);
Le fait de suivre une seule ligne de code évite les doublons d'une DataTable
:
dataTable.DefaultView.ToTable(true, "employeeid");
Où:
le premier paramètre dans ToTable()
est un boolean qui indique si vous voulez des lignes distinctes ou non.
le deuxième paramètre dans 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'une DataSet
, en accédant à une DataTable
spécifique:
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 la performance; 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 l'affichage de données a un indicateur "distinct".
//This will filter all records to be distinct
dt = dt.DefaultView.ToTable(true);
Travaux suivants. Je le travaille 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);
Il m'est arrivé de trouver ceci: http://support.Microsoft.com/default.aspx?scid=kb;en-us;326176#1
Tout en recherchant quelque chose de similaire, uniquement, spécifiquement pour .net 2.0
En supposant que l'OP cherche distinct tout en utilisant DataTable.Select (). (Select () ne supporte pas distinct)
Alors voici 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
}
}
Syntaxe:-
DataTable dt = ds.Tables[0].DefaultView.ToTable(true, "ColumnName");
EX:-
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;
}
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 considérés ensemble comme uniques
La solution la plus simple consiste à utiliser linq puis à 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 valable Pour asp.net 4.0 ^ Framework Si je me souviens bien.
objds.Table1.Select(r => r.ProcessName).AsEnumerable().Distinct();
c'est facile
DataView view = new DataView(dt);
DataTable dt2 = view.ToTable(true, "Column1", "Column2","Column3", ...,"ColumnNth");
et dt2 datatable contiennent les données uniques column1, Column2..ColumnNth.