2012-03-13 110 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