2012-09-05 89 views
-2

的節目數我有兩個數組:比較兩個數組和字符

string[] array1 = {"a","b","c","d","e"} 

string[] array1 = {"x","y","a","b","a"} 

我想打印的結果是這樣的:

a = 3 
b = 2 
c = 1 
d = 1 
e = 1 
x = 1 
y = 1 
z = 1 

我可以運行循環內的循環,找到這個但有沒有更好的方法來達到相同的結果?

我想在不使用LINQ的情況下在純C#中執行此操作。

+0

分享你的一些東西,你可能有最好的解決方案,但我們不知道你是否沒有告訴我們你做了什麼!一旦你可以提供更多,我會很樂意提供讚賞。 –

+0

合併2個數組,並做一個傳統的group-by和count。大量的Q + A。 –

+2

基於「比較兩個數組並顯示常用字符數」我猜測結果應該是[a = 3,b = 2],因爲c,d,e,x,y不常見。你能否澄清要求? – aiodintsov

回答

8

您可以使用LINQ來實現:

var counts = array1.Concat(array2) 
        .GroupBy(v => v) 
        .Select(g => new { Value=g.Key, Number=g.Count() }); 

foreach(var item in counts.OrderBy(i => i.Value)) 
    Console.WriteLine("{0} = {1}", item.Value, item.Number); 

既然你要避免使用LINQ和出於某種原因,擴展方法,你可以建立自己的字典:

var counts = new Dictionary<string, int>(); 
foreach(string item in array1) 
{ 
    if (counts.ContainsKey(item)) 
     counts[item]++; 
    else 
     counts[item] = 1; 
} 
foreach(string item in array2) 
{ 
    if (counts.ContainsKey(item)) 
     counts[item]++; 
    else 
     counts[item] = 1; 
} 

// Print out counts 
foreach(var kvp in counts) 
    Console.WriteLine("{0} = {1}", kvp.Key, kvp.Value); 

請注意,這不會對結果進行排序 - 如果您需要對它們進行排序,您也必須這樣做。

+0

我不想用LINQ來做。我只想知道如何有效地使用普通的C#來完成這項工作。 – Asdfg

+4

@Asdfg沒有指定 - 但有沒有理由避免使用LINQ? –

+0

@Asdfg LINQ是「只是普通的C#」。這是語言的一部分;它不是一個擴展或外部庫/工具。 – Servy

5

您可以使用ConcatGroupByOrderByDescending

var both = array1.Concat(array2); 
var groups = both.GroupBy(s => s).OrderByDescending(g => g.Count()); 
Console.Write(
    String.Join(
     Environment.NewLine, 
      groups.Select(g => String.Format("{0} = {1}", g.Key, g.Count())))); 
1

這看起來像LINQ的工作:

var charCounts = array1.Concat(array2) 
        .GroupBy(c=>c) 
        .Select(g=>new Tuple<char, int>(g.Key, g.Count()); 
        .OrderBy(t=>t.Item1); 

foreach(var result in charCounts) 
    Console.WriteLine(String.Format("{0} = {1}", t.Item1, t.Item2)); 
1

通過兩個陣列讀取並把它們放到一個字典。鍵是數組中的成員,如「a」,「b」等。值是整數作爲計數。所以,如果一個鑰匙存在,你增加計數;否則把鑰匙插入字典有值爲1

0

那麼,基於字符串類型的最幼稚的實施將是這樣的:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string[] array1 = {"a", "b", "c", "d", "e"}; 
     string[] array2 = {"x", "y", "a", "b", "a"}; 

     var histogram = new Dictionary<string, int>(); 
     Fill(histogram, array1); 
     Fill(histogram, array2); 

     foreach (var p in histogram) 
     { 
      Console.WriteLine("{0}={1}",p.Key,p.Value); 
     } 
    } 

    private static void Fill(Dictionary<string, int> histogram, string[] a) 
    { 
     foreach (string s in a) 
     { 
      if (histogram.ContainsKey(s)) 
       histogram[s] += 1; 
      else 
       histogram[s] = 1; 
     } 
    } 
} 

這是構建動態直方圖,打印。 另一種簡單的方法是這樣的,但它更糟糕的可讀性:

static void Main(string[] args) 
    { 
     string[] array1 = {"a", "b", "c", "d", "e"}; 
     string[] array2 = {"x", "y", "a", "b", "a"}; 

     string [] concat = new string[array1.Length+array2.Length]; 
     Array.Copy(array1,concat,array1.Length); 
     Array.Copy(array2,0,concat,array1.Length,array2.Length); 
     Array.Sort(concat); 

     int pos = 0; 
     while(pos<concat.Length) 
     { 
      var cur = concat[pos]; 
      int count = 0; 
      while ((pos<concat.Length) && (concat[pos]==cur)) 
      { 
       pos += 1; 
       count += 1; 
      } 
      Console.WriteLine("{0}={1}",cur,count); 
     } 
    } 

一般 - CONCAT,排序,直方圖上排序的數據。