【问题标题】:c# where clause, instead of for loopc# where 子句,而不是 for 循环
【发布时间】:2022-01-01 21:41:30
【问题描述】:

在我的 C# Form 脚本中,我有一个包含 2-3k 个元素的数组。我需要在该数组中找到一个特定值,但不对其应用 for 循环。循环通过 2-3k 个元素会导致几秒钟的延迟,我不希望这样。这类似于网站的 Mysql 数据库。

在 PHP 网站中,我在索引数据库上使用 where 子句,因此即使表有 100 万行,我也能够在 0.020 秒内获得我需要的唯一行。 C# 有类似的东西吗?

这是我想要实现的目标。

using System;
using System.Linq;
                    
public class Program
{
    public static float[] data = {140, 160, 170, 180, 190, 54235243,234,4213,1234,543,1234,3215,52134,1234,222,333,444,555,666,777,888,999};
    
    public static void Main()
    {
        var queryLowNums =
            from num in data
            where num > 140 and num < 170
            select num;
        
        // num should be 160
        
    }
}

上面的这段代码是无效的,我只是想举例说明我想做什么。在这种情况下是否有这样的语法/命令或任何可以帮助我的东西。循环通过 2-3k 个元素可能需要一秒钟或 2 秒 idk。我知道如果我有给定元素的索引,它将直接加载它而无需 for 循环。但是不知道如何实现。

【问题讨论】:

  • 2k-3k 值不算什么。为什么您认为需要几秒钟才能完成?
  • 在数据库中,值存储在树状数据结构中。如果对值进行排序并进行二进制搜索,则可以在 c# 中实现类似的效果。这实际上取决于您的数据和用例,哪种策略是最好的。
  • 考虑使用更好的结构,例如 hashmap/Dictionary,或者使用二分查找的排序列表,这可能是最快的。这与visual-studio无关,请不要发送垃圾标签

标签: c# floating-point


【解决方案1】:

使用列表

var list = new List<float>() { 140, 160, 170, 180, 190 };
var index = list.IndexOf(160);

 var values = list.Where(x=>x > 140 && x < 190); //it`s work very fast

【讨论】:

  • 这和where num &gt; 140 and num &lt; 170不一样
  • 确实如此。我不知道 140 到 170 之间的 hte 值。可能是 161。
  • 带有list.Where 的新版本仍然会循环整个列表
【解决方案2】:

试试这个

 
    float[] data = { 140, 160, 170, 180, 190, 54235243, 234, 4213, 1234, 543, 1234, 3215, 52134, 1234, 222, 333, 444, 555, 666, 777, 888, 999 };

    float queryLowNums = 0;
    var startIndex = 0;
    Parallel.For(startIndex, data.Length, (j, state) =>
   {
       if (data[j] > 140 && data[j] < 170)
       {
           queryLowNums = data[j];
           state.Break();
       }
   });

输出

160

或者如果您期望多个数字

    var primeNumbers = new ConcurrentBag<float>();

    Parallel.ForEach(data, number =>
    {
       if (number > 140 && number < 170)
        {
            primeNumbers.Add(number);
        }
    });

使用哈希表会快得多,但是在您的情况下,如果您没有它,则查找项目所需的时间比创建哈希表(如果不存在)要少。排序算法也是如此。

【讨论】:

  • @Charles OP 想要最快的方法。比for循环快,但是使用hash会更快。
  • 好的,它有效,我看到它也用于矩阵,这就是我的目标顺便说一句,谢谢。我会测试它,我希望它有效。但这仍然是一个循环吗?
  • 对于相关数据的大小而言,这似乎是不必要的。
  • @VictorTheBeast 循环在某种程度上是不可避免的。正如 Charlieface 和其他人所指出的,如果你想要高效的检索,你需要使用更好的数据结构,比如二叉搜索树或堆或类似的东西。但老实说,3k 元素并不是一个庞大的数组,在现代处理器上基本上可以立即处理。
  • @siride 我同意你的看法。对于 2-3k 条记录,用户不会注意到 for 和 parallel.for 之间的区别。差价至少从 100k 开始。但也许 OP 未来需要这个代码
猜你喜欢
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多