我有一个列表,想要更新由索引确定的某些项目,同时将它们填充到另一个列表中。
我有这堂课:
public class Offer
{
public string LineId {get; set;}
}
我在相关部分之前的代码中填充它。
List<Offer> offersV2...snip...
现在我想要获取特定项目并将它们放入另一个列表中,但首先我需要更新LineId。所以我一直在尝试各种变化:
var offersListX2 = new List<List<Offer>>()
{
new List<Offer>() { offersV2[0].LineId = "1"},
new List<Offer>() { offersV2[8].LineId = "13"}
}
Intellisense(它只是使用反射,所以并不总是准确)说我很高兴但是在编译时我得到一个错误,说不能从Offer转换为字符串。因此,我的列表似乎在更新属性之前投影对象。
所以我尝试了GetElement而不是在编译时使用索引器相同的错误。
var offersListX2 = new List<List<Offer>>()
{
new List<Offer>() { offersV2.GetElement(0).LineId = "1"},
new List<Offer>() { offersV2.GetElement(8).LineId = "13"}
}
如果我抽象出这样的辅助方法,它可以正常工作。
var offersListX2 = new List<List<Offer>>()
{
new List<Offer>() { MyHelperMethod(offersV2[0], "1"},
new List<Offer>() { MyHelperMethod(offersV2[8], "13"}
}
所以我的问题是我是否可以在Linq / Lambda等中执行此操作,从而消除了辅助方法。
由于
答案 0 :(得分:2)
我发现,如果在具有副作用的命令性代码和执行数据转换的更多功能代码之间明确区分,则有助于使代码更加清晰。这就是我的建议:
offersV2[0].LineId = "1";
offersV2[8].LineId = "13";
var offersListX2 = new List<List<Offer>>()
{
new List<Offer>() { offersV2[0] },
new List<Offer>() { offersV2[8] }
};
如果您尝试根据某些条件根据offersV2
中的许多值制作列表,那么LINQ可能很有用。
var offersListX2 = offersV2.Where(...).Select(o => new List<Offer> {o}).ToList();
但是当你只是包含两个这样的预定义值时,我不会推荐它。我应该提到的是,您使用常量数字访问索引并使用魔术字符串设置值这一事实是一个巨大的代码味道。或许offersV2
应该是一个类而不是一个列表吗?或者这些信息应该来自某种收藏?想一想。