Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过2大数据集嵌套循环_C#_Loops_Nested - Fatal编程技术网

C# 通过2大数据集嵌套循环

C# 通过2大数据集嵌套循环,c#,loops,nested,C#,Loops,Nested,我有两组来自不同系统的数据。大约20000张唱片一张。一组数据是列表,另一组是来自我无法控制的系统的记录集(我只能请求记录并接收记录集) 我需要通过将记录集中的一些数据放入匹配的对象结构中,在两个列表中存在的键上进行匹配,从而在2之间合并数据。我尝试的嵌套循环太慢了 有没有一种快速的方法来获得匹配并移动到下一个对象 编辑:现有代码 这是一个非常基本的嵌套循环 results = _sr.SearchLst(ut.ToString(), searchSettings); foreach (BL.

我有两组来自不同系统的数据。大约20000张唱片一张。一组数据是
列表
,另一组是来自我无法控制的系统的记录集(我只能请求记录并接收记录集)

我需要通过将记录集中的一些数据放入匹配的对象结构中,在两个列表中存在的键上进行匹配,从而在2之间合并数据。我尝试的嵌套循环太慢了

有没有一种快速的方法来获得匹配并移动到下一个对象

编辑:现有代码

这是一个非常基本的嵌套循环

results = _sr.SearchLst(ut.ToString(), searchSettings);

foreach (BL.Packet ePacket in eList) {

    for (Int32 j = 0; j < results.Rows.Length; j++) {

        String acckey = results.Rows[0].Data.GetValue(1).ToString();
        String taskname = results.Rows[0].Data.GetValue(2).ToString();

        if (acckey == ePacket.RecKey.ToString()) {
            ePacket.prop1 = taskname;
            ePacket.prop2 = acckey;
        }
    }
}
results=\u sr.SearchLst(ut.ToString(),searchSettings);
foreach(eList中的BL.Packet ePacket){
对于(Int32 j=0;j
我也看了Linq,但无法理解这两个角色将如何配合……我不确定Linq是否会更快

解决方案:

这就是我最后做的事情

//move object from list to dictionary
var dict = eList.Cast<BaseObj>().ToDictionary(o => o.RecKey, o => o);

results = _sr.SearchLst(ut.ToString(), searchSettings);
if (results.Rows.Length > 0) {

    //loop through all rows in recordset
    for (Int32 j = 0; j < results.Rows.Length; j++) {
        id = Convert.ToInt32(results.Rows[j].Data.GetValue(1)); 
        taskname = results.Rows[j].Data.GetValue(2).ToString();

        if (dict.ContainsKey(id)) {
            //recordset id found in dictionary, so grab taskname
            ePacket = ((BL.Packet)dict[id]);
            ePacket.prop1 = taskname;
        }
    }
}

//move dictionary back to list
List<BaseObj> eListReturn = new List<BaseObj>(dict.Values);
return eListReturn;
//将对象从列表移动到字典
var dict=eList.Cast().ToDictionary(o=>o.RecKey,o=>o);
结果=_sr.SearchLst(ut.ToString(),searchSettings);
如果(results.Rows.Length>0){
//循环遍历记录集中的所有行
对于(Int32 j=0;j
谢谢大家的帮助

使用
字典
在内存中的列表集合上,使用键作为键和对象作为值填充字典

在记录集上循环。使用字典可以对匹配元素进行O(1)查找,从而消除内存集合上的循环。

使用
字典
在内存中的列表集合上,使用键作为键和对象作为值填充字典


在记录集上循环。使用字典,您可以对匹配元素进行O(1)查找,从而消除内存集合上的循环。

您可以在记录集对象及其API上编写一个抽象层,允许使用密钥进行访问。从键到记录集,它有点像一本字典


您将有两次迭代,每次迭代一次。两次迭代是O(N),而嵌套循环是O(N^2)。

您可以在记录集对象及其API上编写一个抽象层,允许使用键进行访问。从键到记录集,它有点像一本字典

您将有两次迭代,每次迭代一次。两次迭代是O(N),而嵌套循环是O(N^2)。

试试这个:

var Object = from o in Objects
             join r in RecordSet equal o.YourKey equal r.YourForeignKey
             select Object { x = r.YourProperty };
关于LINQ的其他参考,这里有101个样品:

(旧消息供参考)

使用LINQ将两个if信息连接到一个IEnumerable(如列表)中。 差不多

var combinedData = from i in listItems
                   join r in recordSet on r.ID equals i.ID
                   select new { i.Name, r.Property };
这里有一个使用LINQ连接的链接 此外,谷歌LINQ的例子,你的.net平台,有很多,它相当快,在做什么,你正在寻找

在四处寻找类似的线索之后,我发现了一些非常有用的东西,我将在这里总结。问题是,我们不确定您希望在循环的内部括号中执行什么操作

我假设您只需要一组“小部件”,它们可以通过键与“小部件”列表连接

如果您希望将一组小部件和小工具合并到一个新的whatsits对象中,可能您正在为图表或其他对象构建一个平面表,请使用以下示例:

var whatsits = from w in widgets
               join g in gadgets on w.gadgetID equal g.ID
               select new whatsit { name = w.name, id = w.ID };
如果您希望将一组小部件与小部件连接起来,其中一个小部件属性=某个值,然后对每个小部件执行操作,则首先收集小部件,然后按如下方式对新集合进行访问:

var widgetList = from w in widgets
                 join g in gadgets on w.gadgetID equals g.ID
                 where g.Name = "whatsit"
                 select w;

foreach (widget w in widgetList)
{
    // Do a bunch of stuff to each widget
}
注意,在上面的LINQ上做一个性能测试,看看它是先运行更好的widget,还是先在连接中运行gadget。

试试以下方法:

var Object = from o in Objects
             join r in RecordSet equal o.YourKey equal r.YourForeignKey
             select Object { x = r.YourProperty };
关于LINQ的其他参考,这里有101个样品:

(旧消息供参考)

使用LINQ将两个if信息连接到一个IEnumerable(如列表)中。 差不多

var combinedData = from i in listItems
                   join r in recordSet on r.ID equals i.ID
                   select new { i.Name, r.Property };
这里有一个使用LINQ连接的链接 此外,谷歌LINQ的例子,你的.net平台,有很多,它相当快,在做什么,你正在寻找

在四处寻找类似的线索之后,我发现了一些非常有用的东西,我将在这里总结。问题是,我们不确定您希望在循环的内部括号中执行什么操作

我假设您只需要一组“小部件”,它们可以通过键与“小部件”列表连接

如果您希望将一组小部件和小工具合并到一个新的whatsits对象中,可能您正在为图表或其他对象构建一个平面表,请使用以下示例:

var whatsits = from w in widgets
               join g in gadgets on w.gadgetID equal g.ID
               select new whatsit { name = w.name, id = w.ID };
如果您希望将一组小部件与小部件连接起来,其中一个小部件属性=某个值,然后对每个小部件执行操作,则首先收集小部件,然后按如下方式对新集合进行访问:

var widgetList = from w in widgets
                 join g in gadgets on w.gadgetID equals g.ID
                 where g.Name = "whatsit"
                 select w;

foreach (widget w in widgetList)
{
    // Do a bunch of stuff to each widget
}

注意,可能值得对上面的LINQ进行性能测试,看看它是先运行更好的小部件,还是先运行连接中的小部件。

如果记录集按排序顺序返回值,例如

值键

“val”| 1

“val2”| 2

“瓦尔2”| 3

“瓦尔2”| 4

然后您可以进行排序合并联接。这是一个伪代码

while (!endofRecordset || !endofMyCollection) do
   if (recorset[rIndex].Key==myList[lIndex].Key)
       Join(recorset[rIndex], myList[lIndex])
   else if (recordset[rIndex] > myList[lIndex])
       lIndex++
   else 
       rIndex++
end while
编辑:

<