林克在两个条件列表之间

本文关键字:两个 条件 列表 之间 林克 | 更新日期: 2023-09-27 18:26:24

我有设置类

public class Setting 
{
    public virtual string Key { get; set; }
    public virtual string Value { get; set; }
}

我必须列出

IEnumerable<Setting> A1 => contain {"A","1"}{"B","2"}
IEnumerable<Setting> A2 => contain {"A","1"}{"B","5"}

我希望linq语句从列表A2中选择具有相同关键字和不同值的元素,这里是{"B","5"}

我试过

A2.Where(x => A1.Any(y => y.Value != x.Value)).ToList();

这给我A2 中的两个元素

有人能帮我吗谢谢


**编辑**我的设置类

 public class Setting : Entity<int>
{
    public virtual DateTime? ModificationDate { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual string Key { get; set; }
    public virtual string Value { get; set; }
    public virtual string ModifiedBy { get; set; }
    public virtual string Type { get; set; }
    public virtual string ValidateRegex { get; set; }    
    public virtual bool IsSystem { get; set; }
}

我已经从mvc IEnumerable<Setting>返回了让它命名设置,

然后我从数据库中得到原始设置IEnumerable<Setting>,让它命名为dbsettings

我想知道设置中更改的值,以便对其进行更新

林克在两个条件列表之间

您还需要比较Key

A2.Where(x => A1.Any(y => y.Key == x.Key && y.Value != x.Value)).ToList();

以下示例返回{ "B", "5" }作为结果:

void Main()
{
    var a1 = new List<Setting>(new Setting[] { 
        new Setting() { Key = "A", Value = "1" }, 
        new Setting() { Key = "B", Value = "2" } });
    var a2 = new List<Setting>(new Setting[] { 
        new Setting() { Key = "A", Value = "1" }, 
        new Setting() { Key = "B", Value = "5" } });
    var result = a2.Where(x => a1.Any(y => y.Key == x.Key && y.Value != x.Value)).ToList();
    Console.WriteLine(result);
}

在比较字符串时,应该注意==!=总是分别区分大小写进行比较。因此,两个列表中的键需要以相同的方式书写(在情况下的差异也将被视为相关差异)。您也可以使用字符串的重载。Compare可更详细地指定比较选项。

这应该做到:

A2.Where(x => A1.Any(y => y.Key == x.Key && y.Value != x.Value))

顺便说一句,你的设定课似乎是在重新发明轮子。DictionaryTupleNameValueCollection都可以为您做到这一点。

        var A1 = new List<Setting>(){new Setting(){Key = "A", Value = "1"}};
        var A2 = new List<Setting>() { new Setting() { Key = "A", Value = "2" } };
        var a1Keys = A1.Select(x => x.Key).ToList();
        var dupKeys = A2.Where(x => a1Keys.Contains(x.Key)).Select(x=>x.Key);
        var res = A2.Where(x => dupKeys.Contains(x.Key));

出于性能原因,您可以使用查找:

var a1KeyLookup = A1.ToLookup(x => x.Key);
List<Setting> a2List = A2
    .Where(a2 => a1KeyLookup[a2.Key].Any(a1 => a1.Value != a2.Value))
    .ToList();

这是您的样本数据:

IEnumerable<Setting> A1 = new List<Setting> {
    new Setting{Key="A", Value="1"},
    new Setting{Key="B", Value="2"},
};
IEnumerable<Setting> A2 = new List<Setting> {
    new Setting{Key="A", Value="1"},
    new Setting{Key="B", Value="5"},
};
var a1KeyLookup = A1.ToLookup(x => x.Key);
List<Setting> a2List = A2
    .Where(a2 => a1KeyLookup[a2.Key].Any(a1 => a1.Value != a2.Value))
    .ToList();

它按预期返回一个包含单个项目的列表:Key="B", Value="5"