C# 我想用另一个列表搜索字符串项列表。可能吗?

C# 我想用另一个列表搜索字符串项列表。可能吗?,c#,list,search,C#,List,Search,贮藏 在一个列表中找到项 在其他列表中找不到项。 我这样做得到了第一部分 for(int i = 0; i < list1.Count; i++) { for (int j = 0; j < list2.Count; j++) { if (list1[i] == list2[j])) { list3.Add(list1[i]);

贮藏

  • 在一个列表中找到项

  • 在其他列表中找不到项。 我这样做得到了第一部分

       for(int i = 0; i < list1.Count; i++)
        {
            for (int j = 0; j < list2.Count; j++)
            {
                if (list1[i] == list2[j]))
                {
                    list3.Add(list1[i]);
                    continue;
                }
             }
         }
    
    for(int i=0;i
  • 我需要“第二部分”。搜索列表还有更好的方法,但我更喜欢这个方法。

    你可以试试

    var list3 = list1.Where(x => list2.Any(y => x == y));
    var list4 = list1.Except(list3);
    
    如果需要列表,上述代码将为您提供IEnumerable,只需在分号(
    )之前添加
    .Tolist()

    如果您需要列表4中包含列表1和列表2中不常见的项目,那么

    var list3 = list1.Where(x => list2.Any(y => x == y));
    var list4 = list1.Except(list3).Concat(list2.Except(list3));
    
    更多阅读的脚注:


    您可以使用Linq的
    Intersect()
    Except()
    来执行以下操作:

    var data    = new List<string>{"A", "B", "C", "D", "E", "F", "G", "H", "I"};
    var targets = new List<string>{"C", "D", "E", "F"};
    
    var found    = data.Intersect(targets).ToList();
    var notFound = data.Except   (targets).ToList();
    
    Console.WriteLine("Found:     " + string.Join(", ", found));
    Console.WriteLine("Not found: " + string.Join(", ", notFound));
    
    var data=新列表{“A”、“B”、“C”、“D”、“E”、“F”、“G”、“H”、“I”};
    var目标=新列表{“C”、“D”、“E”、“F”};
    var found=data.Intersect(targets.ToList();
    var notFound=data.Except(targets.ToList();
    WriteLine(“找到:”+string.Join(“,”,找到));
    WriteLine(“未找到:”+string.Join(“,”,未找到));
    
    在我看来,当您在学习和/或研究循环时,我看到其他答案使用LINQ(这是目前为止最好的方法)。因此,如果您更愿意像处理“已找到”列表那样遵循“基本”方法,您可以尝试以下处理“未找到”列表的方法:

    for(int i=0;i

    如果你的目的不是像我假设的那样简单地学习语言和语法,那么请选择使用LINQ的其他答案,因为它们更专业。

    这是否回答了你的问题@MathewHD我想他的问题是获取列表中不存在的项目顺便说一下。。。您可以在“已找到”列表的解决方案中删除continue语句。在它所在的位置,它对您没有任何作用,因为在调用list3.Add()之后,它无论如何都会在内部for循环上“继续”。+1用于简化where条件,而不是bool值可以简化为
    if(list1[i]==list2[j])list3.Add(list1[i]);else list4.Add(list1[i])@Lucifer,这不起作用。每次list1中的元素与list2中的元素不匹配时,您都会将该list1元素添加到list4中。您最终会将列表1的所有元素都放入列表4中。更糟糕的是,事实上,因为其中很多都会重复几次。
    
    for (int i = 0; i < list1.Count; i++)
    {
        bool add = true;
        for (int j = 0; j < list2.Count; j++)
        {
            if (list1[i] == list2[j])
            {
                add = false;
                break;
            }
        }
        if (add == true)
        {
            list4.Add(list1[i]);
        }
    }