2010-11-01 45 views
4

我在MSDN上看到一个例子,如果没有返回任何东西,它会让你指定默认值。见下:在对象中使用DefaultIfEmpty?

List<int> months = new List<int> { }; 
int firstMonth2 = months.DefaultIfEmpty(1).First(); 

是否有可能与一个对象使用此功能?例如:

class object 
{ 
    int id; 
    string name; 
} 

代码:

List<myObjec> objs = new List<myObjec> {}; 
string defaultName = objs.DefaultIfEmpty(/*something to define object in here*/).name; 

UPDATE:

我想我可以做这样的事情:

List<myObjec> objs = new List<myObjec> {}; 
string defaultName = objs.DefaultIfEmpty(new myObjec(-1,"test")).name; 

但一直没能。应该注意的是,我实际上正在尝试在我的DBML中使用LINQ-To-SQL定义的对象上使用此方法。不知道这种情况在这种情况下是否有所作为。

+5

是的,当然。你试过了吗?问题在哪里? – 2010-11-01 20:08:39

+0

也许'new myObjec()'是你在找什么? – zneak 2010-11-01 20:13:02

+0

我不确定它是否有所作为,但是这是我在LinqToSQL中做的简化版本。我尝试了相当于'new myObjec(-1,“test”)',但它不起作用。 – 2010-11-01 20:19:17

回答

6

您需要传递一个实例化的类作为DefaultIfEmpty的参数。

class Program 
{ 
    static void Main(string[] args) 
    { 
     var lTest = new List<Test>(); 
     var s = lTest.DefaultIfEmpty(new Test() { i = 1, name = "testing" }).First().name; 
     Console.WriteLine(s); 
     Console.ReadLine(); 

    } 
} 

public class Test 
{ 
    public int i { get; set; } 
    public string name { get; set; } 
} 

要添加到它,并使其更加优雅一点(IMO)添加一个默认的构造函数:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var lTest = new List<Test>(); 
     var s = lTest.DefaultIfEmpty(new Test()).First().name; 
     Console.WriteLine(s); 
     Console.ReadLine(); 

    } 
} 

public class Test 
{ 
    public int i { get; set; } 
    public string name { get; set; } 

    public Test() { i = 2; name = "testing2"; } 
} 
1

我必须承认我不太确定我理解你的问题,但如果返回的对象可能为空,我会尝试使用双重问号。像这样:

myList.FirstOrDefault() ?? new myObject(); 
+1

如果列表中没有元素,则首先抛出异常;你想要'FirstOrDefault'。 – Domenic 2010-11-01 20:56:44

+0

谢谢我纠正自己 – 2010-11-02 08:22:36

0

您可以创建一个默认的物体,像这样:

Object o_Obj_Default = new Object(); 
o_Obj_Default.id = 3; 
o_Obj_Default.name = "C"; 

,并将其添加到您的默认值:

string defaultName = objs.DefaultIfEmpty(o_Obj_Default).First().name; 

如果您的列表 “OBJ文件” 是空的,结果将是“C”

+0

任何方式来做到这一点内联? – 2010-11-01 20:32:00

+0

当然,如果你的Object有构造函数;字符串defaultName = o_Objs.DefaultIfEmpty(new Object(1,“D”))。First()。Name; – 2010-11-02 12:48:53