替换List <class>的值

时间:2018-03-05 06:44:24

标签: c# list linq

我有两个List<class>List1List2,其中包含多个列:RowNoValue1Value2等,如下所示

的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    |

任何想法或建议?我怎样才能做到这一点?什么是最好和最有效的方法呢?

6 个答案:

答案 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)

  1. list1的所有数据放入Dictionary(键是RowNo)。

  2. 循环list2以更新词典。

  3. Dictionary的数据转换为List

  4. 接近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; }

您可以使用此扩展方法对任何列表对实现相同的要求:

  1. 在您要更改的列表上调用Project
  2. 将要分配的值列表作为第一个参数传递给第一个参数。
  3. 将密钥属性作为第二个参数传递。
  4. 第三个 参数是您要在列表中应用的操作。

答案 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();