2016-02-14 31 views
0

假设您有以下阵列:在C#中的数组记录重复信息

int[] x = new int[6] {2,4,6,8,10,12}; 
    int[] y = new int[6] {3,6,9,12,15,18}; 

如果你想打印的数组是相同的,6和12在这个例子中的值,这将是在C#中这样做的最有效方法?与其他数据类型比如字符串或布尔值是否会有所不同?

+0

定义“高效”。 –

+0

获取必要的任务,以最少的行数完成所需的任务,并获得所需的最低信息。 – UnknownM1

回答

0

您可以使用下面的代码来找到匹配的元素

int[] x = new int[6] { 2, 4, 6, 8, 10, 12 }; 
int[] y = new int[6] { 3, 6, 9, 12, 15, 18 }; 

foreach (int i in x) 
{ 
    if (y.Contains(i)) 
    { 
     Console.WriteLine(i);//Print Matched items 
    } 
} 

只要数据类型是在两个数组相同它将很好地工作。 希望这可以帮助你。

2

标记的答案是O(n * m),当n = m时为O(n^2)。使用其中一个数组的内容创建哈希集,然后检查另一个数组中的哈希集中的项是O(n + m),当n = m时为O(n)。这样做一方面需要额外分配O(n)存储空间,另一方面需要在宇宙结束之前完成,当n很大时。对于有六个元素的阵列,任何解决方案都可以工作对于六百万的阵列,标记的答案不会。这两组代码都很简单。

实现可以在两行中完成。

var hashSet = new HashSet<int>(x); 
var inBoth = y.Where(t => hashSet.Contains(t)); 

下面是一个完整的程序,证明为何O(n^2)的解决方案是为inadequite问题任何真正的大小。如果你想让自己相信这两个实现能够正常工作,那么将totalItems的大小减小到〜100,000,并且它会在合理的时间内完成。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Diagnostics; 

public class Solution 
{ 
    static void Main() 
    { 
     const int totalItems = 1000000; 

     var rng = new Random(); 
     var foo = Enumerable.Range(0, totalItems).Select(x => rng.Next(1, totalItems/2)).ToArray(); 
     var bar = Enumerable.Range(0, totalItems).Select(x => rng.Next(1, totalItems/2)).ToArray(); 

     var sw = new Stopwatch(); 

     sw.Start(); 
     var foobar = new HashSet<int>(foo); 
     var inBoth = bar.Count(t => foobar.Contains(t)); 
     sw.Stop(); 
     Console.WriteLine(sw.Elapsed + " " + inBoth); 

     sw.Reset(); 

     sw.Start(); 
     inBoth = bar.Count(t => foo.Contains(t)); 
     sw.Stop(); 
     Console.WriteLine(sw.Elapsed + " " + inBoth); 

     Console.ReadKey(); 
    } 
}