2010-10-07 4 views
2

Я выбираю одну двойную величину от IEnumerable, как я могу перегрузить FirstOrDefault() функция, возвращать нуль по умолчанию, вместо нуля, Iwant что-то вроде:C# LINQ FirstOrDefault()

double? x = from ... .FirstOrDefault(); 

я теперь я могу исключение catch и написать double? x = null, но у меня есть 20 переменных, и это не так.

ответ

9

Почему бы не просто сделать:

double? x = myDoubles.Cast<double?>().FirstOrDefault(); 
1

Если я правильно понимаю, вы можете создать метод расширения в соответствии с вашими конкретными целями.

Это позволит вам использовать синтаксис:

double? d = (linq expression).MyCustomFirstOrNull(); 

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

Посмотреть этот пример также общий синтаксис методов расширения:

using System.Linq; 
using System.Text; 
using System; 

namespace CustomExtensions 
{ 
    //Extension methods must be defined in a static class 
    public static class StringExtension 
    { 
     // This is the extension method. 
     // The first parameter takes the "this" modifier 
     // and specifies the type for which the method is defined. 
     public static int WordCount(this String str) 
     { 
      return str.Split(new char[] {' ', '.','?'}, StringSplitOptions.RemoveEmptyEntries).Length; 
     } 
    } 
} 
namespace Extension_Methods_Simple 
{ 
    //Import the extension method namespace. 
    using CustomExtensions; 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string s = "The quick brown fox jumped over the lazy dog."; 
      // Call the method as if it were an 
      // instance method on the type. Note that the first 
      // parameter is not specified by the calling code. 
      int i = s.WordCount(); 
      System.Console.WriteLine("Word count of s is {0}", i); 
     } 
    } 
} 

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

+0

может у плз дать ссылку, где можно прочитать о расширениях, я не знаю ничего о LINQ – eba

+0

общий синтаксис хорошо), но ничего о LINQ – eba

+0

@eba - Вы спросили о том, как «перегрузки» методом FirstOrDefault. Это делается с помощью методов расширения в .Net и не ограничивается Linq. Эрик послужил хорошим примером для вашей конкретной ситуации. –

16

Дону Исключить исключение. Цель исключения - сказать вам, что у вас есть ошибка, а не как поток управления.

Это довольно просто написать свой собственный метод расширения, который делает то, что вы хотите, так это сделать:

public static double? FirstOrNull(this IEnumerable<double> items) 
{ 
    foreach(double item in items) 
     return item; 
    return null; 
} 

Или, если вы хотите быть любителю об этом:

public static T? FirstOrNull<T>(this IEnumerable<T> items) where T : struct 
{ 
    foreach(T item in items) 
     return item; 
    return null; 
} 

Make смысл?

1

Я не знаю, какие типы запросов вы используете. Но если вы работаете с IEnumerable, вы можете попробовать следующий код:

double? x = (/*Some IEnumerable here*/).OfType<double?>().FirstOrDefault(); 

Но если вы заботитесь о производительности вам лучше использовать методы расширения.

+0

Вы действительно попробовали это на последовательности парных? Что случилось? –

+0

Конечно, я попробовал его со списком , и он работал точно так, как ожидалось, т. Е. Для пустого списка и первого значения. –

5

Вы могли бы написать следующий метод расширения, я только рваные код метода FirstOrDefault с помощью отражателя и исправленный в соответствии с вашими требованиями.

public static class MyExtension 
{ 
    public static TSource? NullOrFirst<TSource>(this IEnumerable<TSource> source) where TSource : struct 
    { 
     if (source == null) 
     { 
      throw new ArgumentNullException("source"); 
     } 
     IList<TSource> list = source as IList<TSource>; 
     if (list != null) 
     { 
      if (list.Count > 0) 
      { 
       return list[0]; 
      } 
     } 
     else 
     { 
      using (IEnumerator<TSource> enumerator = source.GetEnumerator()) 
      { 
       if (enumerator.MoveNext()) 
       { 
        return enumerator.Current; 
       } 
      } 
     } 
     return null; 
    } 
} 
Смежные вопросы