将类附加到列表<class> With Condition

时间:2016-12-15 10:33:16

标签: c# linq

我有2个班级:

public class Person
{
  public string Key {get;set;}
  public Info Info {get;set;}
}

public class Info 
{
  public string Key {get;set;}
  public int ID {get;set;}
  public string Name {get;set;}
}

我有一个List<Person>,其值在Key字段中,但Info字段 null

我的List<Info>在所有字段中都有值。

我想为其Info分配每个Person,具体取决于Key

如何使用linQ执行此操作?

5 个答案:

答案 0 :(得分:1)

首先根据键将信息列表转换为查找,然后遍历各个人,检索信息项并进行分配。

var infoLookup = infoList.ToDictionary(i => i.Key);

foreach (Person p in personList)
{
    Info info;
    if (infoLookup.TryGetValue(p.Key, out info))
        p.Info = info;
}

我们也可以使用infoList.FirstOrDefault()而不是先将其转换为字典,但这样,我们会为每个人添加线性搜索。通过首先将其转换为字典,我们可以获得转换的一次性线性成本,然后可以使用恒定时间查找信息对象。所以总的时间复杂度只是线性的(因为我们仍然需要遍历所有人)。

答案 1 :(得分:1)

一个简单的foreach应该

foreach (var person in people)
{
    person.Info = infos.FirstOrDefault(x => x.Key == person.key);
}

答案 2 :(得分:0)

foreach(var person in myPersonList)
{
    item.Info = myInfoPerson.Where(o => o.key == person.key).FirstOrDefault();
}

答案 3 :(得分:-1)

使用联接查询:

示例数据

List<Person> persons = new List<Person>()
{
    new Person() { Key = "key1" },
    new Person() { Key = "key2" },
};

List<Info> infos = new List<Info>()
{
    new Info() { Key="key1", Name="name1", ID=1 },
    new Info() { Key="key1", Name="name2", ID=2 },
    new Info() { Key="key2", Name="name3", ID=1 }
};

<强>查询:

var joinQuery = from c in persons
                join info in infos on c.Key equals info.Key
                select new Person { Key = c.Key, Info = info };

答案 4 :(得分:-2)

这样可行。

info.ForEach(x => { person.FirstOrDefault(y => y.Key == x.Key).Info = x; });