如何以最好的方式replace列表项

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

我已经取代如上。 还有没有比这个更好的地方呢?

你可以使它更可读,更高效:

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

这只索引索引一次。 你的方法首先使用Contains ,它需要循环所有的项目(在最坏的情况下),然后你使用IndexOf来重新枚举项目。

使用Lambda查找列表中的索引并使用此索引来replace列表项目。

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

您正在访问您的列表两次以replace一个元素。 我觉得简单for循环应该是足够的:

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

为什么不使用扩展方法?

考虑下面的代码:

  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 stringList = new List<string> { "a", "a", "c", "d"}; stringList.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} 
  • 没有代码重复
  • 没有必要inputlong linqexpression式
  • 不需要额外的使用

源代码:

 namespace System.Collections.Generic { public static class Extensions { public static int Replace<T>(this IList<T> 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<T>(this IList<T> 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<T> Replace<T>(this IEnumerable<T> source, T oldValue, T newValue) { if (source == null) throw new ArgumentNullException("source"); return source.Select(x => EqualityComparer<T>.Default.Equals(x, oldValue) ? newValue : x); } } } 

前两个方法已被添加到更改引用types的对象到位。 当然,你可以使用所有types的第三种方法。

PS感谢迈克的观察 ,我添加了ReplaceAll方法。

如果不是最好的,但是你也可以使用它

 List<string> data = new List<string> (new string[] { "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"); 

使用FindIndex和和lambda来查找和replace你的值:

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

或者,根据Rusian L.的build议,如果您正在search的项目可以在列表中不止一次:

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

在rokkuchan的回答后,只是一个小小的升级:

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

我认为最好使用ObservableCollection而不是List,并在需要将其转换为列表时将其转换为列表。 通过可观察的集合,你可以在两行中删除和添加元素,但是你必须编写十几行代码才能使用列表来获得这个function。 这个链接可能会对ObservableCollection <>和List <>有个清晰的概念