列表转换C#LINQ

时间:2012-09-17 07:12:14

标签: c# linq ilist

我有两个课程如下

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 Lists隐藏

6 个答案:

答案 0 :(得分:7)

当然可以:

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

这会从ClassXClassY中选择所有常见属性,并为每个ClassX初始化ClassY个实例。然后,它会调用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的所有属性。

答案 1 :(得分:2)

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

答案 2 :(得分: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

答案 3 :(得分:1)

尝试以下

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

答案 4 :(得分:1)

如果你不想改变你的对象(例如通过Adrian实现基类的想法),那么就做直截了当的方式:

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

答案 5 :(得分:0)

伪代码:

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