2012-09-17 41 views
0

我有两个类,如下列表皈依C#LINQ

public class ClassX 
{ 
    int id, 
    string title, 
    string description 
} 

public class ClassY 
{ 
    int id, 
    string title, 
    string description, 
    int localeId, 
    int clientId 
} 

我从每个类的两个列表如下

IList<ClassX> listX = new List<ClassX>(); 

IList<ClassY> listY = new List<ClassY>(); 

我需要listY列表转换为LISTX列表

在这种情况下请注意,ClassY的属性即

int localeId, 

int clientId 

不会值填充

我可以做一个隐蔽的从listY到LISTX列出

+3

您可以使用ClassX作为优雅的基类。 –

+0

+1 @AdrianFaciu,这个需要一些OO的尖叫 – Dutts

回答

7

是当然的:

listX = listY.Select(y => new ClassX() 
{ 
    description = y.description, 
    id = y.id, 
    title = y.title 
}).ToList(); 

这selectes所有公共属性从ClassXClassY和initalizes一每ClassYClassX实例。然后它调用ToList,它创建了一个新的List<ClassX>

请注意,您需要添加using System.Linq

编辑:我必须同意@AdrianFaciu你应该考虑重构你的类。当你需要将两个类似的类转换为对方时,听起来好像你最好使ClassX的基类为ClassY

public class ClassX 
{ 
    public int id { get; set; } 
    public string title { get; set; } 
    public string description { get; set; } 
} 

public class ClassY : ClassX 
{ 
    public int localeId { get; set; } 
    public int clientId { get; set; } 
} 

现在ClassY隐含有ClassX所有属性。

+0

当从'ClassX'继承'ClassY'时,你可以使用'var listX = listY.Cast ();' – Spontifixus

+1

@Spontifixus:他不需要转换'当'ClassY'已经['is']时ClassY'到'ClassX'(http://msdn.microsoft.com/en-us/library/scekt9xw%28v=vs.110%29.aspx)'ClassX'。 –

+0

是的。明显。在写我的答案之前,我已经混淆了'ClassX'和'ClassY' - 当转换另一个方向时,您需要演员... – Spontifixus

2
var result = listY.Select(y => new ClassX { 
          id = y.id, 
          title = y.title, 
          description = y.description }); 
1

尝试follwing

var listX = listY.Select(y => new ClassX { id = y.id, title = y.title, description = y.description).ToList(); 
2

您可以使用下面的代码获取ClassX对象的名单。

var list = (from t in listY 
      select new ClassX 
       { 
        id = t.id, 
        title = t.title, 
        description = t.description 
       }).ToList(); 

但你可以有ClassY作为子类ClassX和利用继承的

有下面的类结构:

public class ClassX 
{ 
    public int id { get; set; } 
    public string title { get; set; } 
    public string description { get; set; } 
} 

public class ClassY : ClassX 
{ 
    public int localeId { get; set; } 
    public int clientId { get; set; } 
} 

之后你可以这样做:

List<ClassY> listY = new List<ClassY>(); 
listY.Add(new ClassY { id = 0, title = "sometitle1", description = "some description", localeId = 1, clientId = 2 }); 
listY.Add(new ClassY { id = 1, title = "sometitle2", description = "some description", localeId = 1, clientId = 2 }); 
listY.Add(new ClassY { id = 2, title = "sometitle3", description = "some description", localeId = 1, clientId = 2 }); 

List<ClassX> listX = (from t in listY 
        select (ClassX)t).ToList(); //casting to base class 

您将ClassY的项目投射到您的基地ClassX

1

如果您不想更改对象(例如,通过implemeting阿德里安基类的想法),然后做简单的方法:

var listYtoX = listY.Select(y => new ClassX() 
           { 
            id = y.id, 
            title = y.title, 
            description = y.description 
           }).ToList(); 
0

伪代码:

listY.Select(y=>new ClassX(){ id = ..., title = ..., description = ...}).ToList();