C#更优雅替代foreach-search

时间:2012-03-13 14:53:04

标签: c#

以下是类中方法的全部内容:

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,而Name不能只是Foo类的属性。

有没有更优雅的方法来编写此方法?我对C#不是很熟悉,但我觉得有一种扩展方法或者可以将这种方法变成2线的方法。

注意我正在寻找可读性,这不是减少行数的竞赛。如果C#有办法在一行中搜索名为Foo的话,我认为该方法会更清晰。

(我正在使用C#3.5)

4 个答案:

答案 0 :(得分:12)

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

您需要确保自己为using System.Linq

顺便说一下,C#会覆盖字符串的==运算符,因此通常更容易使用==而不是.Equals(更具可读性和惯用的C#)。

答案 1 :(得分:1)

你考虑过LINQ吗?

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

答案 2 :(得分:0)

你可以使用Linq:

var foo = storedFoos.FirstOrDefault(f => f.Name == f.FooInfo.Name);

http://msdn.microsoft.com/en-us/library/bb397926.aspx

答案 3 :(得分: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