【问题标题】:C# Join two List<int>, remove duplicates, NO LINQC# 加入两个 List<int>,删除重复项,没有 LINQ
【发布时间】:2016-05-14 17:55:00
【问题描述】:

这就是想法:我有两个List&lt;int&gt;,我想制作第三个List&lt;int&gt;,并加入上述列表,不重复。我知道如何使用.Union,但我想在不使用 LINQ 的情况下做到这一点。到目前为止,我有这个:

Console.WriteLine("Enter numbers for first list: ");
List<int> firstList = new List<int>{20, 40, 10, 10, 30, 80};
//Console.ReadLine().Split(' ').Select(int.Parse).ToList();
Console.WriteLine("Enter numbers for second list: ");
List<int> secondList = new List<int> {25, 20, 40, 30, 10 };
//Console.ReadLine().Split(' ').Select(int.Parse).ToList();
List<int> newList = new List<int>();
foreach (var item in firstList)
{
    if (secondList.Contains(item))
    {
        continue;
    }
}
newList.Sort();
newList.ForEach(p => Console.WriteLine(p));

我实际上被卡住了...我认为我需要迭代每个列表,如果项目相等,则将它们添加到新列表中一次...但我似乎无法弄清楚如果列表计数不同,该怎么做。 有什么想法吗?

【问题讨论】:

  • 为什么没有 linq?为什么要剥夺自己使用正确工具的权利?这就像在问......我如何用这个钉子将这些板固定在一起NO HAMMERS
  • @CaffGeek Gorilla Glue I hear works wonders..LOL 好比喻
  • 这就是为什么我们有错误的软件,其中有太多的代码行。因为人们不使用经过良好测试和验证的库。
  • 也许 OP 正在使用 C# 的旧(LINQ 之前)版本?
  • 使用 LINQ 方法是正确的做法。没有它们的正确方法是实现它们。曾经有一段时间不存在这些方法。有人必须写它们。你也可以。

标签: c# list join int


【解决方案1】:

这是一个很大的(我的意思是big)警告——它会很慢。您通过使用 LINQ 或不同的集合(例如 HashSet)获得更好的性能。这种方法是 O(n^2) 而 LINQ 等是 O(n)。

如果它不在列表中,只需循环第二个列表,将值添加到第一个列表中。

foreach (var item in secondList)
{
    if (!firstList.Contains(item))
    {
        firstList.Add(item);
    }
}

鉴于您想要在流程结束时创建一个新列表,您只需将第一个列表中的所有项目添加到上述代码之前的结果中:

foreach (var item in firstList)
{
    newList.Add(item);
}

添加时将firstList替换为newList

【讨论】:

  • 天啊,非常感谢...我看了这么久,正如我所说,我出了点问题。 :D
  • 请不要听从这个建议。建议方法的 O(n^2) 与默认 LINQ 的 O(n)。 slowness 的收获不错:)
  • @AlexeiLevenkov - 哦,确实。很慢,但符合 OP 的要求。
  • @AlexeiLevenkov 我知道!这只是一个简单的逻辑练习:)
  • @ChrisF - 你不需要 LINQ 来获得 O(n)。只需使用正确的集合类型。
【解决方案2】:

这样的?

newList.AddRange(firstList);
newList.AddRange(secondList);
newList = newList.Distinct().ToList();
newList.Sort();

【讨论】:

  • 虽然它可能会回答类似的问题,但它不能回答这个问题 - 如果您注意到标题中几乎没有提到“NO LINQ”。
【解决方案3】:

您可以利用不同类型的集合来执行以下操作:

var set = new HashSet<int>(firstList);
set.UnionWith(secondList);

var newList = new List<int>(set);

【讨论】:

  • OP 明确声明他不想使用 LINQ。
  • @ChrisF - 我的错误。自从我使用 .NET(并且不得不阅读文档)以来已经太久了。已更新。
猜你喜欢
  • 2012-09-28
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 2015-11-21
  • 2015-12-29
  • 1970-01-01
相关资源
最近更新 更多