我選擇自IEnumerable一個double值,我怎麼能超載FirstOrDefault()函數,就默認返回而不是零空,iwant是這樣的:C#LINQ FirstOrDefault()
double? x = from ... .FirstOrDefault();
我現在我可以捕獲異常,並寫入雙重? x = null,但我有20個變量,它不是這樣的方式
我選擇自IEnumerable一個double值,我怎麼能超載FirstOrDefault()函數,就默認返回而不是零空,iwant是這樣的:C#LINQ FirstOrDefault()
double? x = from ... .FirstOrDefault();
我現在我可以捕獲異常,並寫入雙重? x = null,但我有20個變量,它不是這樣的方式
爲什麼不只是做:
double? x = myDoubles.Cast<double?>().FirstOrDefault();
如果我的理解正確,您可以創建一個擴展方法來滿足您的特定目的。
這將允許您使用的語法:
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);
}
}
}
唐沒有發現異常。例外的目的是告訴你,你有一個錯誤,而不是作爲控制流程。
這是很簡單的編寫自己的擴展方法,你想要做什麼,這樣做的:
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;
}
製作感?
我不知道你使用什麼類型的查詢。但是,如果你與IEnumerable的工作,你可以試試下面的代碼:
double? x = (/*Some IEnumerable here*/).OfType<double?>().FirstOrDefault();
但是,如果你關心性能,你更好的使用擴展方法。
你真的嘗試過這樣的雙打序列嗎?發生了什麼? – 2010-10-07 04:46:29
當然,我嘗試了列表
你可以寫下面的擴展方法, 我只是使用反射撕開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;
}
}
ü可以PLZ給鏈接,我可以瞭解擴展,我不知道有關LINQ – eba 2010-10-07 04:35:30
一般語法什麼是好的),但沒有關於LINQ – eba 2010-10-07 04:38:48
@eba - 你問如何「過載」的FirstOrDefault方法。這是通過.Net中的擴展方法完成的,並不限於Linq。埃裏克爲您的具體情況提供了一個很好的例子。 – 2010-10-07 04:44:54