Comment remplacer l’élément de la liste de la meilleure façon

if (listofelements.Contains(valueFieldValue.ToSsortingng())) { listofelements[listofelements.IndexOf(valueFieldValue.ToSsortingng())] = value.ToSsortingng(); } 

J’ai remplacé comme ci-dessus. Y a-t-il un autre bestway à comparer à celui-ci?

Vous pourriez le rendre plus lisible et plus efficace:

 ssortingng oldValue = valueFieldValue.ToSsortingng(); ssortingng newValue = value.ToSsortingng(); int index = listofelements.IndexOf(oldValue); if(index != -1) listofelements[index] = newValue; 

Cela ne demande qu’une fois pour l’index. Votre approche utilise Contains abord qui doit boucler tous les éléments (dans le pire des cas), puis vous utilisez IndexOf qui doit à nouveau énumérer les éléments.

Utilisez Lambda pour rechercher l’index dans la liste et utilisez cet index pour remplacer l’élément de liste.

 List listOfSsortingngs = new List {"abc", "123", "ghi"}; listOfSsortingngs[listOfSsortingngs.FindIndex(ind=>ind.Equals("123"))] = "def"; 

Vous accédez à votre liste deux fois pour remplacer un élément. Je pense que simple for boucle devrait suffire:

 var key = valueFieldValue.ToSsortingng(); for (int i = 0; i < listofelements.Count; i++) { if (listofelements[i] == key) { listofelements[i] = value.ToString(); break; } } 

Pourquoi ne pas utiliser les méthodes d’extension?

Considérez le code suivant:

  var intArray = new int[] { 0, 1, 1, 2, 3, 4 }; // Replaces the first occurance and returns the index var index = intArray.Replace(1, 0); // {0, 0, 1, 2, 3, 4}; index=1 var ssortingngList = new List { "a", "a", "c", "d"}; ssortingngList.ReplaceAll("a", "b"); // {"b", "b", "c", "d"}; var intEnum = intArray.Select(x => x); intEnum = intEnum.Replace(0, 1); // {0, 0, 1, 2, 3, 4} => {1, 1, 1, 2, 3, 4} 
  • Aucun code dupliqué
  • Il n’est pas nécessaire de taper de longues expressions linq
  • Il n’y a pas besoin d’usages supplémentaires

Le code source:

 namespace System.Collections.Generic { public static class Extensions { public static int Replace(this IList source, T oldValue, T newValue) { if (source == null) throw new ArgumentNullException("source"); var index = source.IndexOf(oldValue); if (index != -1) source[index] = newValue; return index; } public static void ReplaceAll(this IList source, T oldValue, T newValue) { if (source == null) throw new ArgumentNullException("source"); int index = -1; do { index = source.IndexOf(oldValue); if (index != -1) source[index] = newValue; } while (index != -1); } public static IEnumerable Replace(this IEnumerable source, T oldValue, T newValue) { if (source == null) throw new ArgumentNullException("source"); return source.Select(x => EqualityComparer.Default.Equals(x, oldValue) ? newValue : x); } } } 

Les deux premières méthodes ont été ajoutées pour modifier les objects des types de référence en place. Bien sûr, vous ne pouvez utiliser que la troisième méthode pour tous les types.

PS: Grâce à l’observation de Mike , j’ai ajouté la méthode ReplaceAll.

Utilisez FindIndex et lambda pour rechercher et remplacer vos valeurs:

 int j = listofelements.FindIndex(i => i.Contains(valueFieldValue.ToSsortingng())); //Finds the item index lstSsortingng[j] = lstSsortingng[j].Replace(valueFieldValue.ToSsortingng(), value.ToSsortingng()); //Replaces the item by new value 

Je ne sais pas si c’est le meilleur ou pas mais vous pouvez l’utiliser aussi

 List data = new List (new ssortingng[] { "Computer", "A", "B", "Computer", "B", "A" }); int[] indexes = Enumerable.Range(0, data.Count).Where (i => data[i] == "Computer").ToArray(); Array.ForEach(indexes, i => data[i] = "Calculator"); 

Ou, en vous basant sur la suggestion de Rusian L., si l’élément que vous recherchez peut figurer dans la liste plus d’une fois ::

 [Extension()] public void ReplaceAll(List input, T search, T replace) { int i = 0; do { i = input.FindIndex(i, s => EqualityComparer.Default.Equals(s, search)); if (i > -1) { FileSystem.input(i) = replace; continue; } break; } while (true); } 

Après la réponse de rokkuchan, juste une petite mise à jour:

 List listOfSsortingngs = new List {"abc", "123", "ghi"}; int index = listOfSsortingngs.FindIndex(ind => ind.Equals("123")); if (index > -1) listOfSsortingngs[index] = "def"; 

Je pense qu’il est préférable d’utiliser ObservableCollection au lieu de List, et de le convertir en une liste lorsque nous avons besoin de l’étendre. Avec la collection observable, vous pouvez supprimer et append des éléments sur deux lignes, mais vous devez coder une douzaine de lignes pour obtenir cette fonctionnalité en utilisant une liste. ce lien peut donner une idée claire de ObservableCollection <> vs. List <>