我有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执行此操作?
答案 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;
});