![](/img/trans.png)
[英]Replace property values in a class from List<Dictionary> values
[英]Replace values of List<Class>
我有两个List<class>
, List1
和List2
,其中包含多个列: RowNo
, Value1
, Value2
等,如下所示
清单1
| RowNo | Value |
|-------|-------|
| 1 | 11 |
| 2 | 22 |
| 3 | 33 |
| 4 | 88 |
清单2
| RowNo | Value |
|-------|-------|
| 1 | 44 |
| 2 | 55 |
| 3 | 66 |
如果RowNo
匹配,我想用List2
的元素值替换List1
的元素值。我要生成的输出如下
所需结果
| RowNo | Value |
|-------|-------|
| 1 | 44 |
| 2 | 55 |
| 3 | 66 |
| 4 | 88 |
有任何想法或建议吗? 我该如何实现? 最佳和有效的方法是什么?
您可以使用循环将List1
的值与List2
进行比较,如果找到匹配项,则更新Value
foreach (var item in List1)
{
var match = List2.FirstOrDefault(x => x.RowNo == item.RowNo);
if (match != null)
{
item.Value = match.Value;
}
}
使用Linq
List1.ForEach(l1 => l1.Value = (List2.FirstOrDefault(l2 => l2.RowNo == l1.RowNo) ?? l1).Value);
如果在List2
列表上找不到元素,则l1
列表元素的Value
属性将设置为自身。
完整代码
class MyClass
{
public int RowNo { get; set; }
public int Value { get; set; }
}
var List1 = new List<MyClass>()
{
new MyClass(){RowNo = 1, Value = 11},
new MyClass(){RowNo = 2, Value = 22},
new MyClass(){RowNo = 3, Value = 33},
new MyClass(){RowNo = 4, Value = 88},
};
var List2 = new List<MyClass>()
{
new MyClass(){RowNo = 1, Value = 44},
new MyClass(){RowNo = 2, Value = 55},
new MyClass(){RowNo = 3, Value = 66}
};
List1.ForEach(l1 => l1.Value = (List2.FirstOrDefault(l2 => l2.RowNo == l1.RowNo) ?? l1).Value);
List1.ForEach(x =>
{
var item = List2.FirstOrDefault(y => y.RowNo == x.RowNo);
if (item != null)
{
x.Value = item.Value;
}
});
将list1
所有数据放入Dictionary
(键为RowNo)。
循环遍历list2
以更新字典。
将Dictionary
的数据转换为List
。
它接近O(n)运算。
使用此扩展方法可以实现您想要的:
public static class LinqExtentions
{
public static void Project<T>(this IEnumerable<T> lst1, IEnumerable<T> lst2,
Func<T, object> key, Action<T, T> action)
{
foreach (var item1 in lst1)
{
var item2 = lst2.FirstOrDefault(x => key(x).Equals(key(item1)));
if (item2 != null)
{
action(item1, item2);
}
}
}
}
那么您可以像这样使用它:
List1.Project(List2, x => x.RowNo, (y, z) => { y.Value = z.Value; });
它能做什么
将一个列表投影到另一个列表上,然后匹配两个列表中的键值(在您的示例中为RowNo
),当两个项目具有相同的键时,则应用第三个参数中提供的操作,在此示例中,您希望第一个元素中的元素列表具有与第二个列表中的元素相同的Value
,这正是此委托所做的:
(y, z) => { y.Value = z.Value; }
您可以使用此扩展方法来实现任何一对列表的相同要求:
Project
。 您可以遍历List1
并检查List2
包含匹配项,然后将结果填充到新列表中
List<YourClass> result = new List<YourClass>();
for (int i = 0; i < List1.Count; i++)
{
YourClass resRowValue = List1[i];
if (List2.Count > i && List2[i].RowValue.equals(resStrRowValue.RowValue)
resStr.RowValue = List2[i].RowValue;
result.Add(resRowValue);
}
//set the result to List1
List1 = result;
您也可以使用linq执行此操作
List1 = List1.Select(x => {
int i = List1.IndexOf(x);
YourClass newValue = List2.FirstOrDefault(y => y.RowValue.Equals(x.RowValue));
if (newValue != null)
x.RowValue = newValue.RowValue;
return x;
}).ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.