2009-01-29 103 views
9

我非常喜歡這個ElementAtOrDefaultOperator與泛型列表一起使用的聲音,但我無法弄清楚如何爲我的對象列表定義默認類型。據我所知,如果我有一個如下所示的對象列表,defaultvalue將爲null,但我想返回具有適當值的我自己版本的默認對象。這裏是我的意思是:LINQ如何定義與ElementAtOrDefault運算符一起使用的默認類型

ClassA { 

string fieldA; 
string fieldB; 
ClassB fieldC; 

//constructor 

} 

List<ClassA> myObjects = new List<ClassA>(); 

myObjects.Add(//new object) 
myObjects.Add(//new object) 

所以我希望能夠做到以下幾點:

ClassA newObject = myObjects.ElementAtOrDefault(3); 

而且具有NEWOBJECT是ClassA的的默認類型,我定義的地方。我認爲可能有一個SetDefaultElement或其他方法,但我不認爲它存在。

有什麼想法?

回答

18

只寫你自己的擴展方法:

static T ElementAtOrDefault<T>(this IList<T> list, int index, T @default) 
{ 
    return index >= 0 && index < list.Count ? list[index] : @default; 
} 

,並呼籲:

var item = myObjects.ElementAtOrDefault(3, defaultItem); 

或者,如果你希望默認要懶洋洋地評估,使用Func<T>默認:

static T ElementAtOrDefault<T>(this IList<T> list, int index, 
    Func<T> @default) 
{ 
    return index >= 0 && index < list.Count ? list[index] : @default(); 
} 

例如,此表單可以讓您使用預先定義的項目(例如第一個):

var item = myObjects.ElementAtOrDefault(3, myObjects.First); 

或更靈活:

var item = myObjects.ElementAtOrDefault(3,() => myObjects[2]); 

var item = myObjects.ElementAtOrDefault(3,() => new MyObject {...}); 
+0

適當的過載可能返回缺省值(T)如在實施LINQ。 – user7116 2009-01-29 14:28:41

相關問題