我的代码可以改进使用LINQ吗?

时间:2016-02-24 18:53:58

标签: arrays vb.net linq

我有这个代码,它运行正常,但在大型数据集上运行缓慢。

我想听听专家们是否可以使用Linq或其他方法获得此代码,如果有的话,该怎么做?

  Dim array_of_strings As String()

  ' now I add strings to my array, these come from external file(s). 
  ' This does not take long

 ' Throughout the execution of my program, I need to validate millions
 ' of other strings.

  Dim search_string As String
  Dim indx As Integer

  ' So we get million of situation like this, where I need to find out
 ' where in the array I can find a duplicate of this exact string

  search_string = "the_string_search_for"

  indx = array_of_strings.ToList().IndexOf(search_string)

我的数组中的每个字符串都是唯一的,没有重复。

这非常有效,但就像我说的那样,对于较大的数据集来说太慢了。我运行这个查询数百万次。目前,一百万次查询大约需要1分钟,但这对我来说太慢了。

3 个答案:

答案 0 :(得分:5)

没有必要使用Linq。 如果您使用索引数据结构(如字典),则搜索将为O(log n),代价是稍微长一点的填充结构。但是你做了一次,然后做了一百万次搜索,你就会提前出来。

请参阅此站点的词典说明: https://msdn.microsoft.com/en-us/library/7y3x785f(v=vs.110).aspx

由于(我认为)您正在谈论一个自己的密钥集合,您可以使用SortedSet<T>来节省一些内存 https://msdn.microsoft.com/en-us/library/dd412070(v=vs.110).aspx

答案 1 :(得分:0)

不,我不认为它可以从linq中受益。 相对而言,Linq查询速度很慢。 但是,您可能会尝试多线程。

答案 2 :(得分:-1)

您可以尝试使用似乎非常快的DataTable

void Main()
{
    var dt = new DataTable();
    dt.Columns.Add("foo", typeof(string));    
    dt.Columns.Add("bar", typeof(string));
    dt.Columns[0].Unique = true;

    dt.Rows.Add("baz", "baaz");
    dt.Rows.Add("qux", "quux");

    // add one million rows
    for (var i = 0; i < 1000000; i++)
    {
        dt.Rows.Add((i*2).ToString(), i);
    }

    var sw = Stopwatch.StartNew();
    // select some arbitrary value
    var results = dt.Select("foo = '513916'");
    // get its index
    dt.Rows.IndexOf(results.First()).Dump("Row index");
    sw.Stop();
    sw.Dump("Elapsed");
}

Elapsed

(我无法将其翻译成VB)