使用Linq为另一个对象列表中的每个项目创建新的对象列表

时间:2019-08-08 06:01:14

标签: c# linq

我有一个对象

public class test
 { 
     public object obj1;
     public List<string> items;
 }

我有一个List<test>。我想为每个item创建一个具有obj1item属性的新对象items列表可以为null或为空。 Linq 有什么办法吗?

2 个答案:

答案 0 :(得分:0)

List<test> tests = new List<test>();
var ob1=new test{ obj1 = "obj1" };
var ob2=new test{ obj1 = "obj2" };
var ob3=new test{ obj1 = "obj3" };
var ob4=new test{ obj1 = null };
tests.Add(ob1);
tests.Add(ob2);
tests.Add(ob3);
tests.Add(ob4);

var result = tests.Select(e => new NewType
{
     name = e.obj1 != null ? e.obj1.ToString() : null
});

foreach (var item in result)
{
    Console.WriteLine(item.name);
}

这是您要寻找的吗?

答案 1 :(得分:0)

说Test.Obj1有两个要包含在每个新项目中的属性,即“名称”和“ ID”,以及列表中的一个项目-尝试这样的查询。

将使用(例如)每个Test.Obj1.List的第一个元素生成一个新的(匿名)对象的列表

IEnumerable<dynamic> results = tests
    .Select(o => new { Name = o.obj1.Name, 
                       ID = o.obj1.Id, 
                       Item = o.items.First() ?? null} )
    .ToList();

Console.WriteLine(results.ElementAt(0));
Console.WriteLine(results.ElementAt(1));
Console.WriteLine(results.ElementAt(2));

//  { Name = Foo, ID = 1, Item = a }
//  { Name = Bar, ID = 2, Item = d }
//  { Name = Goo, ID = 3, Item = g }


// Example types below...
public class Obj1
{
    public string Name {get; set;}
    public int Id {get; set;}

    public Obj1(string name, int id)
    {
        Name = name;
        Id = id;
    }
}

// Create some instances
Obj1 objA = new MyObject("Foo", 1);
Obj1 objB = new MyObject("Bar", 2);
Obj1 objC = new MyObject("Goo", 3);

// Your test class that contains the custom object, and a list
public class Test
{ 
    public Obj1 obj1;
    public List<string> items;

    public Test(Obj1 myobject, List<string> myItems)
    {
        obj1 = myobject;
        items = myItems;
    }
}

// Make a list of test objects
List<Test> tests = new List<Test>{
    new Test(objA, new List<string>{"a", "b", "c"}),
    new Test(objB, new List<string>{"d", "e", "f"}),
    new Test(objC, new List<string>{"g", "h", "i"})};

对于new {},您可以根据需要替换为命名类型T和构造函数,并将结果列表更新为

IEnumerable<T>

此外,您可能对要(或全部)列表中的哪个项目有特定的条件,因此可以在构造函数中添加一个更有趣的查询,而不是.First()

或者只获取整个测试项,将构造函数调整为

new { Obj = o.obj1, Items = o.items}

希望这会有所帮助-此集合中有一些很棒的链接:https://docs.microsoft.com/en-us/dotnet/csharp/linq/perform-a-subquery-on-a-grouping-operation