林克在两个条件列表之间
本文关键字:两个 条件 列表 之间 林克 | 更新日期: 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))
顺便说一句,你的设定课似乎是在重新发明轮子。Dictionary
、Tuple
和NameValueCollection
都可以为您做到这一点。
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"