C# 替换列表的值<;类别>;
我有两个C# 替换列表的值<;类别>;,c#,list,linq,C#,List,Linq,我有两个List,List1和List2,其中包含多个列:RowNo,Value1,Value2,如下所示 列表1 | RowNo | Value | |-------|-------| | 1 | 11 | | 2 | 22 | | 3 | 33 | | 4 | 88 | 列表2 | RowNo | Value | |-------|-------| | 1 | 44 | | 2 | 55 | | 3
List
,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
中的值进行比较,如果找到匹配项,则更新值
foreach (var item in List1)
{
var match = List2.FirstOrDefault(x => x.RowNo == item.RowNo);
if (match != null)
{
item.Value = match.Value;
}
}
您可以使用循环将
List1
中的值与List2
中的值进行比较,如果找到匹配项,则更新值
foreach (var item in List1)
{
var match = List2.FirstOrDefault(x => x.RowNo == item.RowNo);
if (match != null)
{
item.Value = match.Value;
}
}
您可以循环查看
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;
您可以循环查看
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;
list1
的所有数据放入字典
(键为行号)字典
中的数据转换为列表
list1
的所有数据放入字典
(键为行号)字典
中的数据转换为列表
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);
class-MyClass
{
public int RowNo{get;set;}
公共int值{get;set;}
}
var List1=新列表()
{
新建MyClass(){RowNo=1,Value=11},
新建MyClass(){RowNo=2,Value=22},
新建MyClass(){RowNo=3,Value=33},
新建MyClass(){RowNo=4,Value=88},
};
var List2=新列表()
{
新建MyClass(){RowNo=1,Value=44},
新建MyClass(){RowNo=2,Value=55},
新建MyClass(){RowNo=3,Value=66}
};
List1.ForEach(l1=>l1.Value=(List2.FirstOrDefault(l2=>l2.RowNo==l1.RowNo)??l1.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);
class-MyClass
{
public int RowNo{get;set;}
公共int值{get;set;}
}
var List1=新列表()
{
新建MyClass(){RowNo=1,Value=11},
新建MyClass(){RowNo=2,Value=22},
新建MyClass(){RowNo=3,Value=33},
新建MyClass(){RowNo=4,Value=88},
};
var List2=新列表()
{
新建MyClass(){RowNo=1,Value=44},
新建MyClass(){RowNo=2,Value=55},
新建MyClass(){RowNo=3,Value=66}
};
List1.ForEach(l1=>l1.Value=(List2.FirstOrDefault(l2=>l2.RowNo==l1.RowNo)??l1.Value);
使用此扩展方法实现您想要的:
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);
}
}
}
}
它的作用
将一个列表投影到另一个列表上,然后匹配两个列表中的键值(RowNo
,在您的示例中),当两个项目具有相同的键值时,则应用第三个参数中提供的操作,在本例中,您希望第一个列表中的元素具有与第二个列表中的元素相同的值,这正是此代理所做的:
(y, z) => { y.Value = z.Value; }
您可以使用此扩展方法来实现任何列表对的相同要求:
在要更改的列表上调用Project
李>
将要指定给第一个列表的值列表作为第一个参数传递给
将key属性作为第二个参数传递
第三
参数是要在列表上应用的操作
使用此扩展方法实现您想要的:
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);
}
}
}
}
它的作用
将一个列表投影到另一个列表上,然后匹配两个列表中的键值(RowNo
,在您的示例中),当两个项目具有相同的键值时,则应用第三个参数中提供的操作,在本例中,您希望第一个列表中的元素具有与第二个列表中的元素相同的值,这正是此代理所做的:
(y, z) => { y.Value = z.Value; }
您可以使用此扩展方法来实现任何列表对的相同要求:
在要更改的列表上调用Project
李>
将要指定给第一个列表的值列表作为第一个参数传递给
将key属性作为第二个参数传递
第三
参数是要在列表上应用的操作
您的类类型是string吗?RowNo
是否唯一且行为类似于Id?我有类型列表List@Pwavel002我更新了我的答案以使用linqis您的类类型是string?是RowNo
唯一的并且像Id一样吗?我有类型列表List@Pwavel002我更新了答案,使用linq|
不是对象的一部分,这是演示用的only@MohamedElshawaf我们可以用Linq而不是循环来实现这一点吗?此外,列表还有更多的列,不仅仅是两列,我还必须只替换一列值。@Pwavel002现在检查我的答案|
不是对象的一部分,只是为了演示only@MohamedElshawaf我们可以用Linq而不是循环来实现这一点吗?此外,列表还有更多的列,不仅是两列,而且我必须只替换一列值。@Pwavel002现在检查我的答案