web-dev-qa-db-ja.com

オブジェクトのリスト内のオブジェクトを置き換える

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;

上記のコードでは、customListItem2newCustomListItemに置き換えます。

リスト内のアイテムを削除してから、新しいアイテムを挿入する必要がありますか? customListItem2 = newCustomListItemの単純な割り当てはできませんか?

リスト内のアイテムを別のアイテムに置き換える最も効率的な方法は何ですか?

前もって感謝します

25
user3736648

_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");
_
41
Abbas
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);
8
Hamid Pourjam

リストの順序が重要でない場合は、これを試すことができます

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 );
2
user4093832