LINQ语句优化

本文关键字:优化 语句 LINQ | 更新日期: 2023-09-27 18:11:07

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

可以用一个语句写出来吗?测量我是否可以提供SingleOrDefault返回的默认元素?

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

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

解决方案也应该适用于值类型(int, double, enum, struct,…)

LINQ语句优化

可以使用DefaultIfEmpty():

var person = People.Where(p => p.Name == parameter).DefaultIfEmpty(DefaultPerson).Single();

你可以定义一个扩展:

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);

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

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

您可以创建一个扩展方法,如果没有找到,它会给您一个实例:

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");