的節目數我有兩個數組:比較兩個數組和字符
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#中執行此操作。
的節目數我有兩個數組:比較兩個數組和字符
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#中執行此操作。
您可以使用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);
請注意,這不會對結果進行排序 - 如果您需要對它們進行排序,您也必須這樣做。
您可以使用Concat
,GroupBy
和OrderByDescending
:
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()))));
這看起來像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));
通過兩個陣列讀取並把它們放到一個字典。鍵是數組中的成員,如「a」,「b」等。值是整數作爲計數。所以,如果一個鑰匙存在,你增加計數;否則把鑰匙插入字典有值爲1
那麼,基於字符串類型的最幼稚的實施將是這樣的:
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,排序,直方圖上排序的數據。
分享你的一些東西,你可能有最好的解決方案,但我們不知道你是否沒有告訴我們你做了什麼!一旦你可以提供更多,我會很樂意提供讚賞。 –
合併2個數組,並做一個傳統的group-by和count。大量的Q + A。 –
基於「比較兩個數組並顯示常用字符數」我猜測結果應該是[a = 3,b = 2],因爲c,d,e,x,y不常見。你能否澄清要求? – aiodintsov