从仅包含不同项目的两个列表中创建新列表?

时间:2019-02-12 14:09:16

标签: c#

我有两个包含一些值的列表。我想创建新列表并添加两个都不同的两个列表中的所有值。

我是LINQ的新手,还没有经验。所以我以这种方式做到了,但这不是我想要的。

  

如果两个列表中都存在该值,则新列表仅包含不同的值,然后该值将仅在新列表中出现一次。


  

我通过使用Distinct Extension方法实现了它,但这不是我想要的...我希望新列表仅包含Distinct值。

代码:

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> firstList_names = new List<string>()
            {
                "Rehan",
                "Hamza",
                "Adil",
                "Arif",
                "Hamid",
                "Hadeed"
            };

            List<string> secondList_names = new List<string>()
            {
                "Mahboob",
                "Zeeshan",
                "Rizwan",
                "Hamid",
                "Rehan",
                "Hamza"
            };

            List<string> result = new List<string>();

            foreach (var nameOfFirstList in firstList_names)
                result.Add(nameOfFirstList);

            foreach (var namesOfSecondList in secondList_names)
                result.Add(namesOfSecondList);

            Console.Write(result.Distinct().Count());
        }
    }
}

2 个答案:

答案 0 :(得分:2)

遵循此示例(摘自https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.union?view=netframework-4.7.2

    int[] ints1 = { 5, 3, 9, 7, 5, 9, 3, 7 };
int[] ints2 = { 8, 3, 6, 4, 4, 9, 1, 0 };

IEnumerable<int> union = ints1.Union(ints2);

foreach (int num in union)
{
    Console.Write("{0} ", num);
}

/*
 This code produces the following output:

 5 3 9 7 8 6 4 1 0
*/

答案 1 :(得分:1)

为了只获取两个列表共有的项目,可以使用System.Linq扩展方法Enumerable.Intersect,该方法返回两个列表的 intersection

var intersection = firstList_names.Intersect(secondList_names);

但是,您的问题有些混乱。如果要同时从两个列表中选择所有项目(没有重复项),则可以使用Union扩展方法:

var union = firstList_names.Union(secondList_names);

如果您想以“老式”方式(不使用扩展方法)进行操作,则可以执行以下示例。

对于路口:

var intersection = new List<string>();

foreach(var item in firstList_names)
{
    if (secondList_names.Contains(item) && !intersection.Contains(item))
    {
        intersection.Add(item);
    }
}

联盟:

// Start with a list of the distinct firstList_names
var union = new List<string>();

foreach(var item in firstList_names)
{
    if (!union.Contains(item))
    {
        union.Add(item);
    }
}

// Add any items from the secondList_names that don't exist
foreach (var item in secondList_names)
{
    if (!union.Contains(item))
    {
        union.Add(item);
    }
}