[英]Fastest way to search a positive number in the last column of a Datatable in C#
我有一個巨大的數據表。 在其最后一欄中,有兩種類型的條目: 0
或a (where 0< a <=1, all a's are equal)
我需要在該列中找到a's and
值及其計數。 Usual
for`循環大約需要30毫秒,這是我花不起的。 有誰能想到這里的調整以使其更快? 該列的總和將始終為1.,例如
最后一欄是
[0.5, 0, 0, 0, 0.5]
回應表示贊賞。
謝謝。
那么我們能否說所有“ a”值相等且它們的總和等於1? 在這種情況下,非零值的數量將等於1 / a。 您需要做的就是找到第一個“ a”值,然后計算其逆值。 例如,一旦找到正值,您就可以中斷for循環,
public int numberOfPositives()
{
foreach (myRowClass row in myDataBase.GetTable<myRowClass>())
{
if (row.lastColumn > 0) return (int)Math.Round(1 / row.lastColumn,0);
}
return 0;
}
或者,如果您的表可以由該列排序,則只需要獲取第一個值並計算其逆值,就根本不需要for循環。
與您的循環相比,這如何衡量?
var t = new DataTable();
t.Columns.Add(new DataColumn("Value", typeof(decimal)));
t.Rows.Add(.5m);
t.Rows.Add(.5m);
t.Rows.Add(.5m);
t.Rows.Add(0m );
t.Rows.Add(0m );
t.Rows.Add(0m );
// dump is a method provided by linqpad (https://www.linqpad.net/)
t.Compute("COUNT(Value)", "Value > 0").Dump();
t.Compute("SUM(Value)", "Value > 0").Dump();
給我
3
1.5
另外,您將需要更好的數據結構,例如,僅包含非零值的哈希表或字典,以及在其他位置保存的零計數。
Artiga,我不知道您有多少價值觀。 我使用HashSet
創建的此示例在191毫秒內HashSet
約一千萬個正值。
var random = new Random();
var values = new HashSet<decimal>();
int i = 10000000;
var sw = Stopwatch.StartNew();
decimal epsilon = 0.1m;
while (i-- > 0)
{
var value = (decimal)random.NextDouble();
// assume values below .1 are zero.
if (value - epsilon > 0)
values.Add(value);
}
sw.ElapsedMilliseconds.Dump("create");
sw = Stopwatch.StartNew();
values.Count().Dump(Convert.ToString(sw.ElapsedMilliseconds));
values.Sum().Dump(Convert.ToString(sw.ElapsedMilliseconds));
給我
創造
4313(創建列表需要四秒鍾-很長的時間...)
0(零毫秒)
8980437(值的實際計數)
191(191毫秒)
4939932.287292723677015(總和)
如果您的數據表保存在數據庫中,則可以使用以下SQL命令獲取列中a的不同值數
SELECT COUNT(DISTINCT ColumnName)
FROM DBNAME
where ColumnName > 0 and ColumnName < 1
如果這不是您想要的,請回到我身邊
DataTable dt = new DataTable();
dt.Columns.Add("ABC",typeof(double));
for (int i = 0; i < 100; i++)
{
Random r = new Random();
DataRow dr = dt.NewRow();
if (i % 2 != 0)
{
dr[0] = (double)r.Next(0, 2)/i;
}
else
{
dr[0] = 0;
}
dt.Rows.Add(dr);
}
int coutPositiveNumber = dt.AsEnumerable().Count(p => p.Field<double>("ABC")>0);
這個coutPositiveNumber將給您所有正數Count!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.