更新索引器指定的列表<>项,同时生成另一个列表<>

本文关键字:列表 另一个 更新索引 | 更新日期: 2023-09-27 17:56:58

>我有一个列表,想要更新由其索引确定的某些项目,同时将它们填充到另一个列表中。

我有这个类:

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"} 
}

智能感知(只是使用反射,所以并不总是准确的)说我很好,但在编译时我收到一个错误,说无法从报价转换为字符串。因此,我的 List 似乎在更新属性之前投影对象。

所以我尝试了 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 等中做到这一点,消除辅助方法。

谢谢

更新索引器指定的列表<>项,同时生成另一个列表<>

我发现,如果您明确区分具有副作用的命令性代码和执行数据转换的更多功能代码,则有助于使代码更加清晰。这是我的建议:

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应该是一个类而不是一个列表?或者这些信息应该来自某种集合?想一想。