Disons que j'ai une liste de certaines valeurs de colonne provenant d'une table, comment puis-je supprimer les chaînes vides et les valeurs en double. S'il vous plaît voir le code suivant:
List<string> dtList = dtReportsList.AsEnumerable().Select(dr => dr.Field<string>("column1")).ToList();
C’est ce que j’ai codé tout à l’heure, mais le code d’Amiram est bien plus élégant. Je vais donc choisir la réponse suivante:
DataTable dtReportsList = someclass.GetReportsList();
if (dtReportsList.Rows.Count > 0)
{
List<string> dtList = dtReportsList.AsEnumerable().Select(dr => dr.Field<string>("column1")).ToList();
dtList.RemoveAll(x=>x == "");
dtList = dtList.Distinct().ToList();
rcboModule.DataSource = dtList;
rcboModule.DataBind();
rcboModule.Items.Insert(0, new RadComboBoxItem("All", "All"));
}
dtList = dtList.Where(s => !string.IsNullOrWhiteSpace(s)).Distinct().ToList()
J'ai supposé que les chaînes vides et les espaces sont comme nuls. Sinon, vous pouvez utiliser IsNullOrEmpty
(autoriser les espaces) ou s != null
La réponse d’Amiram est correcte, mais Distinct () tel qu’implémenté est un N2 opération; Pour chaque élément de la liste, l'algorithme le compare à tous les éléments déjà traités et le renvoie s'il est unique ou l'ignore sinon. Nous pouvons faire mieux.
Une liste triée peut être déduite en temps linéaire; si l'élément en cours est égal à l'élément précédent, ignorez-le, sinon renvoyez-le. Le tri est NlogN, alors même le tri de la collection procure un avantage:
public static IEnumerable<T> SortAndDedupe<T>(this IEnumerable<T> input)
{
var toDedupe = input.OrderBy(x=>x);
T prev;
foreach(var element in toDedupe)
{
if(element == prev) continue;
yield return element;
prev = element;
}
}
//Usage
dtList = dtList.Where(s => !string.IsNullOrWhitespace(s)).SortAndDedupe().ToList();
Cela retourne les mêmes éléments. ils sont juste triés.
La solution Amiram Korach est bien rangée. Voici une alternative pour plus de polyvalence.
var count = dtList.Count;
// Perform a reverse tracking.
for (var i = count - 1; i > -1; i--)
{
if (dtList[i]==string.Empty) dtList.RemoveAt(i);
}
// Keep only the unique list items.
dtList = dtList.Distinct().ToList();