2
var person = People.SingleOrDefault(p => p.Name == parameter);
SelectedPerson = person ?? DefaultPerson

这可以写在一个声明中吗?测量我可以提供SingleOrDefault返回的默认元素吗?

我正在寻找这样的东西(第二个参数是我提供的默认元素)。

var person = People.SingleOrDefault(p => p.Name == parameter, DefaultPerson);

该解决方案也应该适用于值类型(整数、双精度、枚举、结构......)。

4

4 回答 4

7

您可以使用 DefaultIfEmpty():

var person = People.Where(p => p.Name == parameter).DefaultIfEmpty(DefaultPerson).Single();
于 2013-04-26T18:05:29.170 回答
4

你可以定义一个扩展:

public static T SingleOrDefault<T>
    (this IEnumerable<T> list, T defaultValue) 
    where T : class
{
    return list.SingleOrDefault() ?? defaultValue;
}

然后调用它:

var person = People.SingleOrDefault(p => p.Name == parameter, DefaultPerson);
于 2013-04-26T18:02:59.737 回答
2

这有点明显,但这对你有用吗?

var person = People.SingleOrDefault(p => p.Name == parameter) ?? DefaultPerson;
于 2013-04-26T18:02:50.870 回答
-1

你可以创建一个扩展方法,如果什么都找不到,它会给你一个实例:

public static class PersonExtensionMethod
{
    public static T SingleOrInstance<T>(this IEnumerable<T> source, Func<T, bool> precate)
    {
        var person = source.SingleOrDefault(precate);

        if (person == null)
            return (T)Activator.CreateInstance(typeof(T));

        return person;
    }
}

并这样称呼它:

 List<Person> persons = new List<Person> { new Person(), new Person(), new Person() };

 var foundPerson = persons.SingleOrInstance<Person>(p => p.Name == "bla");
于 2013-04-26T18:13:27.033 回答