我有两个对象:
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
感谢大家的帮助!!!
答案 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