首页 > 解决方案 > 列表比较和替换匹配条件linq C#

问题描述

public class UserValues
{
    public string UserId { get; set; }
    public int FieldId { get; set; }
    public string FieldValue { get; set; } 
}

public class LookupMeta
{
    public int FieldId { get; set; }
    public int Id { get; set; }
    public int FieldValueId { get; set; }
    public string Title { get; set; }
}

从 DB 中读取后,我将其保存在 2 个不同的列表中。

现在我想将这两个列表与

然后替换FieldValuefromuservaluesFieldValueIdfromlookupMeta

UserValues
    .Where(x => LookupMeta.Any(y => 
        y.FieldId == x.FieldId && 
        y.FieldValueId.Equals(x.FieldValue)))
    .Select(x => x.FieldValue.Replace(x.FieldValue, ???))
        

我也在看这个链接。我对两个列表比较和替换的 C# LINQ 代码感到震惊

在 List 中这样做是好事还是有其他优化的方法?

标签: c#listlinq

解决方案


如果我正确地跟随你,那么.Join()LINQ 中的方法可能对你有用。在这里,我用它来完成我认为你所追求的。

UserValues
.Join(
    LookupMeta, 
    uv => new { uv.FieldId, uv.FieldValue },
    lm => new { lm.FieldId, lm.FieldValueId },
    (uv,lm) => {
        uv.FieldValue = lm.FieldValueId;
        return uv;
    }
);

该方法中的第二行和第三行从源表构建匿名对象。匹配这些值以建立链接。

最后一行将连接的条目作为输入,然后给出您的输出。在您的情况下,我只返回 UserValues 条目。但在此之前,我将其“FieldValue”属性更改为 LookupMeta 条目的“FieldValueId”属性。

你有一些不一致的地方。例如,您在段落中谈论将 FieldValue 与 Id 匹配,但在代码中您将 FieldValue 与 FieldValueId 匹配。此外,您==在一个比较和另一个比较.Equals()中使用。这里没有错误的答案。我只是不知道你的底层对象。所以你可能需要稍微修改我的代码才能得到你想要的。但它显示了我希望对你有用的一般策略。


推荐阅读