繁体   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