C#では、List<T>
があり、T
型のオブジェクトがある場合、List<T>
の特定のアイテムをT
型のオブジェクトに置き換えるにはどうすればよいですか?
ここに私が試したものがあります:
List<CustomListItem> customListItems = new List<CustomListItem>();
CustomListItem customListItem1 = new CustomListItem() { name = "Item 1", date = DateTime.MinValue};
CustomListItem customListItem2 = new CustomListItem() { name = "Item 2", date = DateTime.MinValue };
CustomListItem customListItem3 = new CustomListItem() { name = "Item 3", date = DateTime.MinValue };
customListItems.Add(customListItem1);
customListItems.Add(customListItem2);
customListItems.Add(customListItem3);
CustomListItem newCustomListItem = new CustomListItem() { name = "Item 4", date = DateTime.Now };
customListItem2 = customListItems.Where(i=> i.name == "Item 2").First();
customListItem2 = newCustomListItem;
上記のコードでは、customListItem2
をnewCustomListItem
に置き換えます。
リスト内のアイテムを削除してから、新しいアイテムを挿入する必要がありますか? customListItem2 = newCustomListItem
の単純な割り当てはできませんか?
リスト内のアイテムを別のアイテムに置き換える最も効率的な方法は何ですか?
前もって感謝します
_customListItem2
_の値ではなく、アイテムを交換する必要があります。以下を置き換えるだけです:
_customListItem2 = customListItems.Where(i=> i.name == "Item 2").First();
customListItem2 = newCustomListItem;
_
これとともに:
_customListItem2 = customListItems.Where(i=> i.name == "Item 2").First();
var index = customListItems.IndexOf(customListItem2);
if(index != -1)
customListItems[index] = newCustomListItem;
_
編集:
Roman R。 がコメントに記載されているように、.Where(predicate).First()
を単純なFirst(predicate)
に置き換えることができます。
_customListItem2 = customListItems.First(i=> i.name == "Item 2");
_
var customListItems = new List<CustomListItem>();
var customListItem1 = new CustomListItem() { name = "Item 1", date = DateTime.MinValue };
var customListItem2 = new CustomListItem() { name = "Item 2", date = DateTime.MinValue };
var customListItem3 = new CustomListItem() { name = "Item 3", date = DateTime.MinValue };
customListItems.Add(customListItem1);
customListItems.Add(customListItem2);
customListItems.Add(customListItem3);
var newCustomListItem = new CustomListItem() { name = "Item 4", date = DateTime.Now };
customListItems[customListItems.FindIndex(x => x.name == "Item 2")] = newCustomListItem;
または
public static class ListExtensions
{
public static void Replace<T>(this List<T> list, Predicate<T> oldItemSelector , T newItem)
{
//check for different situations here and throw exception
//if list contains multiple items that match the predicate
//or check for nullability of list and etc ...
var oldItemIndex = list.FindIndex(oldItemSelector);
list[oldItemIndex] = newItem;
}
}
その後
customListItems.Replace(x => x.name == "Item 2", newCustomListItem);
リストの順序が重要でない場合は、これを試すことができます
CustomListItem newCustomListItem = new CustomListItem() { name = "Item 4", date = DateTime.Now };
customListItem2 = customListItems.Where(i=> i.name == "Item 2").First();
customListItems.Remove(customListItem2);
customListItems.Add(newCustomListItem );