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}
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 <>