2010-10-07 72 views
2

我選擇自IEnumerable一個double值,我怎麼能超載FirstOrDefault()函數,就默認返回而不是零空,iwant是這樣的:C#LINQ FirstOrDefault()

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

我現在我可以捕獲異常,並寫入雙重? 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

ü可以PLZ給鏈接,我可以瞭解擴展,我不知道有關LINQ – eba 2010-10-07 04:35:30

+0

一般語法什麼是好的),但沒有關於LINQ – eba 2010-10-07 04:38:48

+0

@eba - 你問如何「過載」的FirstOrDefault方法。這是通過.Net中的擴展方法完成的,並不限於Linq。埃裏克爲您的具體情況提供了一個很好的例子。 – 2010-10-07 04:44:54

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

製作感?

1

我不知道你使用什麼類型的查詢。但是,如果你與IEnumerable的工作,你可以試試下面的代碼:

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

但是,如果你關心性能,你更好的使用擴展方法。

+0

你真的嘗試過這樣的雙打序列嗎?發生了什麼? – 2010-10-07 04:46:29

+0

當然,我嘗試了列表,它完全按照預期工作,即空列表和第一個值爲空。 – 2010-10-07 05:06:38

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; 
    } 
} 
相關問題