在C#中,我有一個列表,其中包含字符串格式的數字。計算所有這些數字的最佳方法是什麼?例如說我有三個時間我的意思是在UNIX中排名第十..在列表中計數數字
awk的,你可以這樣說
tempArray["5"] +=1
它類似於一個KeyValuePair,但它是隻讀的。
任何快速和智能的方式?
在C#中,我有一個列表,其中包含字符串格式的數字。計算所有這些數字的最佳方法是什麼?例如說我有三個時間我的意思是在UNIX中排名第十..在列表中計數數字
awk的,你可以這樣說
tempArray["5"] +=1
它類似於一個KeyValuePair,但它是隻讀的。
任何快速和智能的方式?
(如digEmAll的回答指出,我假設你真的不關心他們的數字 - 這裏的一切都假定你想將它們視爲字符串)
的簡單方式做到這一點是使用LINQ:
var dictionary = values.GroupBy(x => x)
.ToDictionary(group => group.Key, group => group.Count());
您可以建立自己的字典,像這樣:
var map = new Dictionary<string, int>();
foreach (string number in list)
{
int count;
// You'd normally want to check the return value, but in this case you
// don't care.
map.TryGetValue(number, out count);
map[number] = count + 1;
}
...但我更喜歡LINQ方法的簡潔:)它會有點低效率,請注意 - 如果這是一個問題,我個人可能會創建一個通用的「計數」擴展方法:
public static Dictionary<T, int> GroupCount<T>(this IEnumerable<T> source)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
var map = new Dictionary<T, int>();
foreach (T value in source)
{
int count;
map.TryGetValue(number, out count);
map[number] = count + 1;
}
return map;
}
(您可能需要另一個重載受理IEqualityComparer<T>
)已經寫了這一次,就可以重複使用它,你需要獲得計數項目的任何時間:
var counts = list.GroupCount();
很容易與LINQ:
var occurrenciesByNumber = list.GroupBy(x => x)
.ToDictionary(x => x.Key, x.Count());
當然,即使您的數字表示爲字符串,但該代碼在例如"001"
和"1"
之間的區別也是相同的,即使概念上的數字相同。
要計算具有相同價值的數字,例如,你可以這樣做:
var occurrenciesByNumber = list.GroupBy(x => int.Parse(x))
.ToDictionary(x => x.Key, x.Count());