如何以最好的方式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 <>有个清晰的概念