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
    的所有数据放入
    字典
    (键为行号)

  • 在列表2上循环以更新字典

  • 字典
    中的数据转换为
    列表

  • 它接近O(n)操作

  • list1
    的所有数据放入
    字典
    (键为行号)

  • 在列表2上循环以更新字典

  • 字典
    中的数据转换为
    列表

  • 它接近O(n)操作。

    使用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);
    
    使用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现在检查我的答案