使用foreach()优化我的搜索功能 - 性能

时间:2013-08-06 08:59:14

标签: c# wpf mvvm csla

这是合约。我有3张桌子。

  1. Main(包含ID和SubMain列表)~130项(首次过滤后)

  2. SubMain(包含SubMainID)~120项 (它有一个n到m的引用所以还有另一个表)

  3. MainToSub(包含ID,MainID和SubMainID)~500项

  4. 主要是我正在使用的模型,我在GridView中显示。使用此foreach,我搜索其中包含SearchSubMainID的每个Model部件。这有效但问题是我跳到了超过72000的foreach并没有真正优化

    foreach (var item in MainToSub)
    { 
     // 500 Jumps
        foreach (var temp in Main)
        {
            if (item.MainID == temp.ID && item.SubMainID == SearchSubMainID)
            {
                Model.Add(temp);
                // ~ 10 Jumps
            }
           // 72000 jumps
        }
    }
    

    问题: 有没有办法优化foreach

3 个答案:

答案 0 :(得分:1)

您可以使用Dictionary,让自己的类用作包含MainIDSubMainID的密钥。使用此Dictionary您无需搜索,您只需找到......有点。

答案 1 :(得分:1)

好吧,你可以将其中一张支票移到foreach

foreach (var item in MainToSub)
    if (item.SubMainID == SearchSubMainID)
        foreach (var temp in Main)
            if (item.MainID == temp.ID)
                Model.Add(temp);

这不是真正的优化,但您也可以将其转换为LINQ表达式:

foreach (var temp in MainToSub
    .Where(i => i.SubMainID == SearchSubMainID)
    .Join(Main, i => i.MainID, t => t.ID, (i, t) => t))
        Model.Add(temp);

答案 2 :(得分:0)

您也可以sort lists并尝试使用BinarySearch进行搜索 - 然后是O(log n)。但使用Dictionary的解决方案要简单得多。