簡體   English   中英

在C#中的數據表的最后一列中搜索正數的最快方法

[英]Fastest way to search a positive number in the last column of a Datatable in C#

我有一個巨大的數據表。 在其最后一欄中,有兩種類型的條目: 0a (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM