.Net列表ForEach项目

时间:2012-12-07 00:08:42

标签: c# .net linq list foreach

我有两个对象:

public class ClassA
{
   public int Id
   public string name;

   public ClassB myObjectB;

}
public class ClassB
{
   public int Id
   public string name
}

拥有< ClassA>的2个列表< ClassB的> List1中的一些项目与Id匹配List2上的项目...我想设置objectB foreach项目...

foreach(ClassA item in List1)
{
   ClassB obj = (from b in List2 where b.Id == item.Id select b).SingleOrDefault()
   if(obj != null)
   {
       item.myObjectB = obj; 
       ////////break;    <- ignore this
   }
}

这个解决方案适合我,但我只是想知道是否有更好的方法来做到这一点,而不是Foreach

感谢大家的帮助!!!

4 个答案:

答案 0 :(得分:8)

我认为在这种情况下,foreach实际上是适当的方法,因为您正在改变列表。但是,您可能会稍微简化一下代码:

foreach(ClassA item in List1)
{
    item.myObjectB = List2.FirstOrDefault(b => b.Id == item.Id);
}

这将每次设置项目,但如果没有匹配则将设置为null。如果您已在myObjectB中拥有项目并将其设置为null是不合适的,则可以使用:

foreach(ClassA item in List1)
{
    item.myObjectB = List2.FirstOrDefault(b => b.Id == item.Id) ?? item.myObjectB;
}

答案 1 :(得分:1)

扩展Reed的答案..你实际上可以在单行中执行此操作,因为列表具有ForEach方法。

List1.ForEach(item => item.myObjectB = List2.FirstOrDefault(b => b.Id == item.Id) ?? item.myObjectB);

答案 2 :(得分:0)

List<ClassA> list1 = new List<ClassA>();
List<ClassB> list2 = new List<ClassB>();

list1.Add(new ClassA { Id = 2, name = "a2" });
list1.Add(new ClassA { Id = 3, name = "a3" });
list1.Add(new ClassA { Id = 4, name = "a4" });
list1.Add(new ClassA { Id = 5, name = "a5" });

list2.Add(new ClassB { Id = 1, name = "b1" });
list2.Add(new ClassB { Id = 2, name = "b2" });
list2.Add(new ClassB { Id = 4, name = "b4" });
list2.Add(new ClassB { Id = 5, name = "b5" });

// Goal is to set ClassA::myObjectB from List1 to 
// matching instance (if any) of ClassB from List2
var query = 
    from a in list1
    from b in list2
    where a.Id == b.Id
    select Tuple.Create(a, b);  
foreach (var element in query)
    element.Item1.myObjectB = element.Item2;

<强>更新

或者如果你真的不想要一个for循环,我只是意识到你可以使用这样一个事实,即赋值返回一个值,同时在混淆的代码竞赛中输入一个条目:)

(from a in list1
 from b in list2
 where a.Id == b.Id
 select a.myObjectB = b).ToList();

<强> UPDATE2

我只想到了一种替代方法 - 根据您的情况,懒惰机制可能对您有用吗?

public class ClassA
{
   public int Id
   public string name;

   private ClassB myObjectB;
   public ClassB MyObjectB { 
      get { return myObjectB ?? (myObjectB = list2.FirstOrDefault(x => this.Id == x.Id)); } 
   }
}

答案 3 :(得分:0)

课程定义如下:

class ClassA {
   public int Id { get; private set; }
   public string name { get; private set; }

   public ClassB myObjectB { get; set; }

   public ClassA(int pId, string pName) {
      Id = pId;
      name = pName;
   }
}

class ClassB {
   public int Id { get; private set; }
   public string name { get; private set; }

   public ClassB(int pId, string pName) {
      Id = pId;
      name = pName;
   }
}

您可以使用LINQ Join方法执行以下操作:

var listA = new List<ClassA> {
   new ClassA(1, "OneA"),
   new ClassA(2, "TwoA"),
   new ClassA(3, "ThreeA")
};

var listB = new List<ClassB> {
   new ClassB(1, "OneB"),
   new ClassB(2, "TwoB"),
   new ClassB(4, "FourB")
};

listA
.Join(
   listB,
   itemA => itemA.Id,
   itemB => itemB.Id,
   (itemA, itemB) => new { ItemA = itemA, ItemB = itemB }
).ForEach(pair => pair.ItemA.myObjectB = pair.ItemB);

listA.ForEach(itemA => Console.WriteLine(
   "{0} maps to {1}",
   itemA == null
      ? "null"
      : itemA.name,
   (itemA == null || itemA.myObjectB == null)
      ? "null"
      : itemA.myObjectB.name
));

输出是:

OneA maps to OneB
TwoA maps to TwoB
ThreeA maps to null