Utilisez-vous .NET 3.5? Si vous lancez vos lignes de données, vous pouvez utiliser LINQ to Objects:
var distinctRows = table.Rows.Cast<DataRow>().Distinct(new E());
...
public class E : IEqualityComparer<DataRow>
{
bool IEqualityComparer<DataRow>.Equals(DataRow x, DataRow y)
{
return x["colA"] == y["colA"];
}
int IEqualityComparer<DataRow>.GetHashCode(DataRow obj)
{
return obj["colA"].GetHashCode();
}
}
Ou une encore plus simple façon, puisque vous basant sur les valeurs de colonne unique:
var distinct = from r in table.Rows.Cast<DataRow>()
group r by (string)r["colA"] into g
select g.First();
Si vous devez faire une nouvelle sur DataTable de ces lignes distinctes, vous pouvez le faire:
var t2 = new DataTable();
t2.Columns.AddRange(table.Columns.Cast<DataColumn>().ToArray());
foreach(var r in distinct)
{
t2.Rows.Add(r);
}
Ou s'il serait plus pratique pour travailler avec des objets d'affaires, vous pouvez faire une conversion facile:
var persons = (from r in distinct
select new PersonInfo
{
EmpId = (string)r["colA"],
FirstName = (string)r["colB"],
LastName = (string)r["colC"],
}).ToList();
...
public class PersonInfo
{
public string EmpId {get;set;}
public string FirstName {get;set;}
public string LastName {get;set;}
}
Mise à jour
Tout ce que vous pouvez faire dans LINQ to Objects peut également être fait sans elle: il faut juste plus de code. Par exemple:
var table = new DataTable();
var rowSet = new HashSet<DataRow>(new E());
var newTable = new DataTable();
foreach(DataColumn column in table.Columns)
{
newTable.Columns.Add(column);
}
foreach(DataRow row in table.Rows)
{
if(!rowSet.Contains(row))
{
rowSet.Add(row);
newTable.Rows.Add(row);
}
}
Vous pouvez également utiliser une stratégie similaire pour supprimer simplement des lignes en double de la table d'origine au lieu de créer une nouvelle table.
Est-ce que vous vous souciez de * qui * des similaires/duplicats que vous souhaitez conserver? Le "premier" (en stockage)? Une autre colonne discriminante? Voulez-vous effectuer un agrégat sur les autres valeurs de colonne? Plus de détails sont requis. –
Gardez l'un d'entre eux est ok. Des bonnes idées? – George2
Vous répertoriez la pile technologique complète, mais il semble que vous ne souhaitiez que récupérer des objets d'un objet DataTable. Est-ce correct? Avez-vous le contrôle sur l'origine de ces données? Si vous ne pouvez en premier lieu sélectionner que des éléments distincts de la base de données, cela sera plus efficace que de filtrer les éléments en double dans une base de données ultérieure. – StriplingWarrior