if (listofelements.Contains(valueFieldValue.ToString()))
{
listofelements[listofelements.IndexOf(valueFieldValue.ToString())] = value.ToString();
}
Я заменил, как и выше. Есть ли еще лучшее место для сравнения, чем этот?
if (listofelements.Contains(valueFieldValue.ToString()))
{
listofelements[listofelements.IndexOf(valueFieldValue.ToString())] = value.ToString();
}
Я заменил, как и выше. Есть ли еще лучшее место для сравнения, чем этот?
Используйте Lambda для поиска индекса в списке и используйте этот индекс, чтобы заменить элемент списка.
List<string> listOfStrings = new List<string> {"abc", "123", "ghi"};
listOfStrings[listOfStrings.FindIndex(ind=>ind.Equals("123"))] = "def";
Вы можете сделать его более читабельным и более эффективным:
string oldValue = valueFieldValue.ToString();
string newValue = value.ToString();
int index = listofelements.IndexOf(oldValue);
if(index != -1)
listofelements[index] = newValue;
Это запрашивает только один раз для индекса. В вашем подходе сначала используется Contains
, в котором необходимо закодировать все элементы (в худшем случае), тогда вы используете IndexOf
, который должен снова перечислять элементы.
Вы дважды получаете доступ к своему списку, чтобы заменить один элемент. Я думаю, что простого цикла 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}
Исходный код:
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);
}
}
}
Первые два метода были добавлены для изменения объектов ссылочных типов на месте. Конечно, вы можете использовать только третий метод для всех типов.
P.S. Благодаря наблюдению Майка, я добавил метод ReplaceAll.
Используйте FindIndex
и лямбду, чтобы найти и заменить ваши значения:
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
После ответа rokkuchan, просто немного обновите:
List<string> listOfStrings = new List<string> {"abc", "123", "ghi"};
int index = listOfStrings.FindIndex(ind => ind.Equals("123"));
if (index > -1)
listOfStrings[index] = "def";
Я не хочу, если это лучше или нет, но вы также можете использовать его
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");
Или, основываясь на предложении Rusian L., если элемент, который вы ищете, может быть в списке более одного раза::
[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);
}
Я думаю, что лучше использовать ObservableCollection вместо List и преобразовать его в список, когда нам нужно его разграничить. с наблюдаемой коллекцией вы можете удалить и добавить элемент в две строки, но вам нужно закодировать дюжину строк, чтобы получить эту функциональность, используя список. эта ссылка может дать четкое представление о ObservableCollection < > vs. List < >
я считаю, что лучше всего сделать это быстро и просто
найти элемент в списке
var d = Details.Where(x => x.ProductID == selectedProduct.ID).SingleOrDefault();
сделать клон из текущего
OrderDetail dd = d;
Обновите свой клон
dd.Quantity++;
найти индекс в списке
int idx = Details.IndexOf(d);
удалить найденный предмет в (1)
Details.Remove(d);
вставить
if (idx > -1)
Details.Insert(idx, dd);
else
Details.Insert(Details.Count, dd);