2010-07-01 154 views
10

我有一個對象列表。這些對象有三個變量,ID,名稱,值爲&。該列表中可能有很多對象,我需要根據ID或名稱找到一個對象,然後更改該值。 例基於對象變量的對象搜索列表

class objec 
{ 
    public string Name; 
    public int UID; 
    public string value; 
} 
List<objec> TextPool = new List<objec>(); 

我怎麼會發現在TextPool的一個條目有「測試」的名稱和它的值改爲「值」。 真正的程序有更多的搜索選項和需要更改的值,所以我不能只使用字典(儘管名稱和UID或唯一標識符)。 任何幫助將是巨大的

回答

22

你可以使用LINQ找到它,然後直接更改的元素:

var item = TextPool.FirstOrDefault(o => o.Name == "test"); 
if (item != null) 
     item.value = "Value"; 

如果你想改變相匹配的所有元素,你可以,可能,甚至做:

TextPool.Where(o => o.Name == "test").ToList().ForEach(o => o.value = "Value"); 

不過,我個人更願意把它分解了,因爲我覺得第二個選項是少維護的(做直接的詢問結果「聞香」給我造成的副作用操作)...

+1

+1。緩慢的typer是緩慢的。 – womp 2010-07-01 00:13:44

+2

調用.ToList()只是爲了使用ForEach擴展給我的氣味更多。 – 2010-07-01 00:15:24

+0

@Joel:ForEach不是擴展;)但是,第二個例子也讓我聞到了 - 但我想我也會列出它作爲一個選項... – 2010-07-01 00:16:32

1

聽起來像是LINQ的工作!

var matchedObject = 
    from t in TextPool 
    where t.UName == "test" 
    select t; 

這假定您的搜索是在代碼中定義的。如果你的代碼是由UI驅動的,你可能只需要做一個線性迭代。要搜索所有可能的屬性,而不進行索引,它不會變得更快。

[編輯:被打了一拳,但在離開這件事作爲一個不同的語法的例子,再加上一個鏈接]

0
List<objec> TextPool = new List<objec>(); 
objec found = TextPool.FirstOrDefault(item => item.Name == "test"); 
if (found != null) found.value = "Value"; 

如果要執行很多查詢,你可以緩存結果在多個字典<>實例(或查詢<>實例如果鍵不唯一)。

2
var find = TextPool.FirstOrDefault(x => x.Name == "test"); 
if (find != null) 
{ 
    find.Name = "Value"; 
}