当前位置:  开发笔记 > 编程语言 > 正文

在基于某些(非全部)属性值比较列表内容时,嵌套foreach的替代方法

如何解决《在基于某些(非全部)属性值比较列表内容时,嵌套foreach的替代方法》经验,为你挑选了1个好方法。

作为这个问题的一部分,反复指出我使用类似于此的代码有一个O(n ^ 2)问题...

public class Foo
{
  public string IdentityValue {get;set;}  
  public string Prop1 {get;set;}
  public string Prop2 {get;set;}

}

List itemSet1 = GenerateLargeItemSet(); //makes a large list, > 5000 items for example
List itemSet2 = GenerateLargeItemSet();

foreach (var itemFromSet1 in itemSet1)
{

  //does a corresponding item exist in itemSet2?
  var itemSet2Item = itemSet2.FirstOrDefault(i => i.IdentityValue == itemFromSet1.IdentityValue);

  if (itemSet2Item != null)
  { 
    //do stuff to create item in the persistent store
  }
  else
  {
    //do stuff to update item in the persistent store
  }
}

原谅字符串比较和并行化的考虑,有没有便宜和通用(对象可以是T型,和身份属性可能是别的东西)的方式,以减少的O这个(N ^ 2)性质是什么?



1> Vadim Martyn..:

解决方案之一是使用具有复杂O(n)的Enumerable.Join方法

List itemSet1 = GenerateLargeItemSet(); //makes a large list, > 5000 items for example
List itemSet2 = GenerateLargeItemSet();

// O(n)
var joinedSet = itemSet1.Join(itemSet2, s1 => s1.IdentityValue, s2 => s2.IdentityValue, (f1, f2) => f1).ToList();

// O(n)
foreach (var joinedItem in joinedSet)
{
    //do stuff to create item in the persistent store
}

// O(n)
var unjoinedSet = itemSet1.Except(joinedSet);

// O(n)
foreach (var unjoinedItem in unjoinedSet)
{
    //do stuff to update item in the persistent store
}

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有