我有两个List<class>
,List1
和List2
,其中包含多个列:RowNo
,Value1
,Value2
等,如下所示
的List1
| RowNo | Value |
|-------|-------|
| 1 | 11 |
| 2 | 22 |
| 3 | 33 |
| 4 | 88 |
列表2
| RowNo | Value |
|-------|-------|
| 1 | 44 |
| 2 | 55 |
| 3 | 66 |
如果List1
匹配,我想将List2
元素的值替换为RowNo
元素的值。我想要生成的输出如下
期望的结果
| RowNo | Value |
|-------|-------|
| 1 | 44 |
| 2 | 55 |
| 3 | 66 |
| 4 | 88 |
任何想法或建议?我怎样才能做到这一点?什么是最好和最有效的方法呢?
答案 0 :(得分:2)
您可以使用循环将List1
中的值与List2
进行比较,如果找到匹配项,请更新Value
foreach (var item in List1)
{
var match = List2.FirstOrDefault(x => x.RowNo == item.RowNo);
if (match != null)
{
item.Value = match.Value;
}
}
答案 1 :(得分:1)
使用Linq
List1.ForEach(l1 => l1.Value = (List2.FirstOrDefault(l2 => l2.RowNo == l1.RowNo) ?? l1).Value);
如果在Value
列表中找不到任何元素,l1
列表元素的List2
属性将设置为自身。
完整代码
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);
答案 2 :(得分:1)
List1.ForEach(x =>
{
var item = List2.FirstOrDefault(y => y.RowNo == x.RowNo);
if (item != null)
{
x.Value = item.Value;
}
});
答案 3 :(得分:0)
将list1
的所有数据放入Dictionary
(键是RowNo)。
循环list2
以更新词典。
将Dictionary
的数据转换为List
。
接近O(n)操作。
答案 4 :(得分:0)
使用此扩展方法来实现您的目标:
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
。 答案 5 :(得分:-1)
您可以循环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();