C# 如何使用LINQ查找两个列表之间的差异

C# 如何使用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

我有两组列表,我希望得到两组列表之间的差异,但就我的逻辑而言,我似乎没有得到预期的结果:

列出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
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中的每个字符串
}
您可以阅读有关
的更多信息,但此处除外:


当你说“差异”时,你是否只想要两个列表中不在另一个列表中的所有项目?如果是,则基本上与“交叉点”相反-这里有一个答案:(注意,这是公认答案的第二个示例)这回答了你的问题吗?和