C# 如何使用LINQ查找两个列表之间的差异
我有两组列表,我希望得到两组列表之间的差异,但就我的逻辑而言,我似乎没有得到预期的结果: 列出AC# 如何使用LINQ查找两个列表之间的差异,c#,list,linq,C#,List,Linq,我有两组列表,我希望得到两组列表之间的差异,但就我的逻辑而言,我似乎没有得到预期的结果: 列出A A002 A75 B908 123456 672314 756213 列表B htg1 EDDIE1 EDD1E2 A002 A75 B908 预期结果 获取列表B中尚未在映射列表(列表A)中维护的所有新代码 这将为我提供以下所有新项目: htg1 EDDIE1 埃迪2 实际产出 当我应用LINQ逻辑进行筛选时,我得到的是列表B中的所有项目: htg1 EDDIE1 EDDIE2 A002 A75
A002
A75
B908
123456
672314
756213 列表B
htg1
EDDIE1
EDD1E2
A002
A75
B908 预期结果
获取列表B中尚未在映射列表(列表A)中维护的所有新代码 这将为我提供以下所有新项目:
htg1
EDDIE1
埃迪2 实际产出
当我应用LINQ逻辑进行筛选时,我得到的是列表B中的所有项目:
htg1
EDDIE1
EDDIE2
A002
A75
B908 这是因为此联接查询返回0行:
List<string> joinItems = new List<string>();
joinItems = (from d1 in mappings
join d2 in references on d1.MappingId equals d2.CustCode
select d1.MappingId).ToList<string>();
List joinItems=new List();
joinItems=(来自映射中的d1)
在d1.MappingId等于d2.CustCode的引用中加入d2
选择d1.MappingId).ToList();
其中映射表示列表A的结果集:
List<Partner> mappings = GetMappingsAsModel();
List mappings=GetMappingsAsModel();
和引用表示列表B的结果集:
List<CustomerCode> references = GetCustomerCodes();
List references=GetCustomerCodes();
为了找出不同之处,我正在这样做:
List<string> cuscodes = references.Select(x => x.CustCode.ToString()).ToList();
var newItems = cuscodes.Except(joinItems);
int newCodes = cuscodes.Except(joinItems).Count();
List cuscodes=references.Select(x=>x.CustCode.ToString()).ToList();
var newItems=cuscodes.Exception(joinItems);
int newCodes=cuscodes.Except(joinItems.Count();
我上面的加入查询有什么问题?var list1=新列表{
var list1 = new List<string> {
"A002",
"A75" ,
"B908" ,
"123456",
"672314",
"756213"};
var list2 = new List<string> {
"htg1" ,
"EDDIE1",
"EDD1E2",
"A002" ,
"A75" ,
"B908"
};
foreach(var item in list2.Except(list1))
{
Console.WriteLine(item);
}
“A002”,
“A75”,
“B908”,
"123456",
"672314",
"756213"};
var list2=新列表{
“htg1”,
“EDDIE1”,
“EDD1E2”,
“A002”,
“A75”,
“B908”
};
foreach(清单2中的var项目除外(清单1))
{
控制台写入线(项目);
}
您可以使用除LINQ之外的方法进行此操作:
static void Main(string[] args)
{
var list1 = new List<string> {
"A002",
"A75" ,
"B908" ,
"123456",
"672314",
"756213"};
var list2 = new List<string> {
"htg1" ,
"EDDIE1",
"EDD1E2",
"A002" ,
"A75" ,
"B908"
};
var difference = list2.Except(list1);
Console.WriteLine(string.Join(", ", difference));
static void Main(字符串[]args)
{
var list1=新列表{
“A002”,
“A75”,
“B908”,
"123456",
"672314",
"756213"};
var list2=新列表{
“htg1”,
“EDDIE1”,
“EDD1E2”,
“A002”,
“A75”,
“B908”
};
var差异=列表2。除了(列表1);
Console.WriteLine(string.Join(“,”,difference));
结果:htg1、EDDIE1、EDD1E2
这是一个有效的示例。确保您的代码列表中实际填写了您作为示例提供的值。使用
方法,该方法产生两个序列的集差(在您的示例中,是字符串列表),这是一种很好且干净的方法
List<string> A = new List<string> {"A002", "A75" ,"B908" ,"123456", "672314", "756213"};
List<string> B = new List<string> {"htg1" ,"EDDIE1", "EDD1E2", "A002","A75" ,"B908"};
List<string> diffs = A.Except(B).ToList(); // ["123456", "672314", "756213"];
foreach(var diff in diffs)
{
// work with each individual string out of diffs here
}
List A=新列表{“A002”、“A75”、“B908”、“123456”、“672314”、“756213”};
列表B=新列表{“htg1”、“EDDIE1”、“EDD1E2”、“A002”、“A75”、“B908”};
列表差异=A.除了(B).ToList();/[“123456”、“672314”、“756213”];
foreach(差异中的var差异)
{
//在这里使用diff中的每个字符串
}
您可以阅读有关的更多信息,但此处除外:
当你说“差异”时,你是否只想要两个列表中不在另一个列表中的所有项目?如果是,则基本上与“交叉点”相反-这里有一个答案:(注意,这是公认答案的第二个示例)这回答了你的问题吗?和