簡體   English   中英

使用LINQ更新集合中的一個對象

[英]Update one object in collection using LINQ

我在這個對象中有對象和集合。

myObject.myCollection.Where(a => a.Id == Id).FirstOrDefault() = newMyCollection;

不幸的是,這沒有用

如果我更改單個元素,則可以工作。 例如:

myObject.myCollection.Where(a => a.Id == Id).FirstOrDefault().Id = newMyCollection.Id;

如何更新所有對象? 謝謝你的幫助

我可以做這樣的事情:

myObject.myCollection.Remove(objectOfMyCollection);
myObject.MyCollection.Add(myNewCollection);

但是:如果我的objectOfMyCollection首先,那么我的新對象將是最后一個。

您可以查詢列表並對其進行迭代:

foreach (var obj in myObject.myCollection.Where(a => a.Id == Id).ToList()) {
    obj.Id = newMyCollection.Id;
}

嘗試這個

var customListItem2 = myObject.myCollection.Where(a => a.Id == Id).FirstOrDefault();
var index = myObject.myCollection.IndexOf(customListItem2);

if(index != -1)
    myObject.myCollection[index] = newCustomListItem;

您將必須替換列表中的基礎引用,而這是LINQ不可能的(這是為查詢而不是更新對象而設計的)。

要使用列表執行此操作,請for -loop中使用舊式:

for(int i = 0; i < myList.Count; i++)
{
    if(myList[i].Id == Id) 
    {
        myList[i] = newElement;
        break;
    }
}

使用for -而不是一個foreach ,因為您在使用列表中的后者,這是不可能再參考實例需要在這里。

另一種方法是創建列表的臨時副本,在列表中獲取匹配的元素及其索引,然后替換原始列表中該索引處的元素:

var tmp = myList;

foreach(var elem in tmp)
{
    if(elem.Id == Id) 
    {
        var index = myList.IndexOf(x => x.Id == Id);
        myList[index] = newElement;
        break;
    }
}

要僅更改第一個索引,您可以執行以下操作:

myObject.myCollection.Where(a => a.Id == Id).FirstOrDefault(a => { a.Id = newMyCollection.Id; return true; });

用簡單的英語可以做到:

- From myCollection get items Where item's Id is equal to Id

- From selected values get FirstItem and set it's Id to the new one

- Do not check the rest

甚至更簡單:

myObject.myCollection.FirstOrDefault(a => { if(a.Id == Id) { a.Id = newMyCollection.Id; return true; } return false; });

如果要UPDATE with JOIN復制SQL UPDATE with JOIN並更新一個或多個對象,則可以使用下面的LINQ,這次使用CollectionBase派生的對象。 但是您可以使用List<T>

(from Type1 o1 in collection1
 join Type2 o2 in collection2 on o1.Id equals o2.RelatedId
 select new { O1 = o1, O2 = o2 }).
 Count(item => (item.O1.SomeProperty = item.O2.SomeOtherProperty) == null);

有點駭人聽聞,但它的行為類似於SQL,並且不會使集合發生變異。 是的,它會創建僅包含原始收集項目參考的輕型對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM