Какой тип element
? Так, AddOrUpdateList(Func<T, bool>)
использует T как тип некоторого обобщенного c кода. Когда у вас есть конкретный элемент, вы должны знать, какой тип кода. И установите конкретное имя класса.
Если вы покажете больше кода, я постараюсь вам помочь.
Может быть, я выхожу из бизнеса, но это кажется странным. В соответствии с именем метода, вы хотите добавить элемент, если он не существует, или обновить его, если он уже есть в списке.
Итак, вот пример типичной реализации такого метода.
public void AddOrUpdate<T, K>(this List<T> list, T element, Func<T, K> keySelector, Action<T, T> mapFunction) : T new()
{
var elementKey = keySelector(element);
var elementForUpdate = list.FirstOrDefault(x => keySelector(x) == elementKey);
var exists = elementForUpdate != null;
if (!exists)
{
var newElement = new T();
list.Add(newElement);
elementForUpdate = list.Last();
}
mapFunction(elementForUpdate, element);
}
Итак, тогда в другой части кода вы можете использовать его так:
...
var itemToAdd = new ClassWithTitle { Title = "Title 1"};
list.AddOrUpdate(itemToAdd , x => x.Title, (destination, origin) =>
{
//Logic to map fields
destination.Title = origin.Title;
destination.SomeOtherField = origin.SomeOtherField;
})
...
Пожалуйста, обратите внимание.
Еще один вариант, если вы работаете со списком (не с базой данных), вы можете использовать метод IndexOf()
, тогда этот метод будет очень простым.
public void AddOrUpdate<T, K>(this List<T> list, T element, Func<T, K> keySelector)
{
var elementKey = keySelector(element);
var elementFounded = list.FirstOrDefault(x => keySelector(x) == elementKey);
var exists = elementForUpdate != null;
if (!exists)
{
//IMPORTANT: Here you add element that sended to method. You should take it into consideration.
//If you want to add a clone of this object, implement interface IClonable and use this method like list.Add(element.Clone());
list.Add(element);
return;
}
var indexOfFoundedElement = list.IndexOf(elementFounded);
//IMPORTANT: Here you replace element that sended to method. You should take it into consideration.
list[indexOfFoundedElement] = element;
}