2012-03-13 108 views
3

下面是一個方法的類中的全部:C#更優雅替代的foreach搜索

public Foo GetFooByInfoName(string name) 
{ 
    Debug.Assert(name != null, "name is not an optional argument"); 
    foreach (Foo f in storedFoos.Values) 
    { 
     if (name.Equals(f.FooInfo.Name)) 
     { 
      return f; 
     } 
    } 
    return null; 
} 

我已經明顯改變了名稱,因此假設FooInfo是必需的,名稱不能簡單地將一個屬性Foo類。

有沒有更優雅的方法來寫這種方法?我對C#不是很熟悉,但是我覺得有一種擴展方法或者可以將這種方法變成雙線程的方法。

注意我在尋找可讀性,這不是減少行數的競賽。我只是認爲,如果C#有一種方法可以在一行中搜索名爲Foo的方法,那麼該方法將更加清晰。

(我使用C#3.5)

回答

12

return storedFoos.FirstOrDefault(f => name == f.FooInfo.Name);

你需要確保你是using System.Linq

順便說一句,C#重寫==運算符的字符串,所以它通常更容易使用==而不是.Equals(更具可讀性和慣用的C#)。

+0

正是我在找的東西 - 謝謝!並感謝關於字符串的說明。不知何故,我知道,但我繼續使用'.Equals'。你能告訴我最好的語言是Java嗎? :-P – Ricket 2012-03-13 15:02:25

+0

我想這是沿着這些線。當我切換到Java時,我因爲這個原因而陷入困境。 – 2012-03-13 15:42:28

+0

關於==重載操作符的字符串:使用什麼StringComparer? OrdinalCaseSensitive/CaseInsentive - CurrentCulture ...我明確的時候會發現它更清晰。 – 2012-03-13 16:23:57

1

你有沒有考慮過LINQ?

storedFoos.FirstOrDefault(f => name.Equals (f.Name)); 
0

你可以使用把它寫這樣的:

public Foo GetFooByInfoName(string name) 
{ 
    Debug.Assert(name != null, "name is not an optional argument"); 
    var f = storedFoos.Values.Where(x => x.FooInfo.Name == name) 
           .FirstOrDefault()//gets the first value or null 
    return f; 
} 

注意:請確保您有一個using System.Linq頂端。

+0

瞭解您的API:storedFoos.Values.FirstOrDefault(x => x.FooInfo.Name == name)更清晰,並且具有相同的結果。 – 2012-03-13 16:24:55