我有这个场景
class A
{
public string id { get; set; }
public string val1 { get; set; }
public string val2 { get; set; }
public string val3 { get; set; }
public string val4 { get; set; }
public string val5 { get; set; }
}
class B
{
public string id { get; set; }
public string val2 { get; set; }
public string val3 { get; set; }
}
List<A> lista = new List<A>(); //10 items
List<B> listb = new List<B>(); //400 items
我想在A
中存储与B
字段id
和val2
val3
匹配的B
值val2
的{{1}}和val3
,A
),我该怎么做?
答案 0 :(得分:1)
您可以使用LINQ / Select将B转换为A并使用AddRange添加它们。
lista.AddRange
(
listb.Select
(
b => new A
{
id = b.id,
val2 = b.val2,
val3 = b.val3
}
)
);
或者,如果您真的希望将A和B都存储在同一个列表中,则可以设置继承关系:
class B
{
public string id { get; set; }
public string val2 { get; set; }
public string val3 { get; set; }
}
class A : B
{
public string val1 { get; set; }
public string val4 { get; set; }
public string val5 { get; set; }
}
var listb = new List<B>();
现在你的列表可以存储A和B,因为A是B的特化。所以你可以这样做:
listb.AddRange(lista);
如果要将原始对象保留在lista
中并且只想更新匹配的属性,则应该使用循环。如果你真的想要的话,可以使用LINQ来实现它,但它实际上不是“意味着”用于更新现有的东西。
由于您获得了查找功能,因此可以使您在字典中存储As更容易一些。字典在内部使用哈希表,因此您也可以获得比扫描更好的性能。因为字典只包含引用,所以原始列表中的对象也会更新。
var dictionarya = lista.ToDictionary
(
item => item.id,
item => item
);
foreach (var b in listb)
{
A a;
if (dictionarya.TryGetValue(b.id, out a))
{
a.val2 = b.val2;
a.val3 = b.val3;
}
}
答案 1 :(得分:1)
以下LINQ查询可以帮助您:
lista.AddRange(from b in listb
let a = new A { id = b.id, val2 = b.val2, val3 = b.val3}
where lista.Any(x => x.id == a.id)
select a);
这将选择与lista中的值共享ID的所有B的列表,然后将结果添加到lista。
答案 2 :(得分:0)
似乎对[^a-zA-Z0-9]?
子句做得很好:
Join
这将完成您对&#34;我希望存储在var result = lista.Join(listb,
a => a.id,
b => b.id,
(a, b) =>
new A { id = a.id, val2 = b.val2, val3 = b.val3 });
中的A
值与B
字段&#34;的匹配。
如果相反,您希望将id
子句的结果累加到Join
,那么您可以使用lista
方法:
AddRange