如何在C#中更新List集合中的元素

时间:2013-07-23 06:46:29

标签: c# linq

我有一个List集合 比如List<clsTest> objList = new List<clsTest>();

它有大约一百列。

Predicate<ScreenDefinition> linqQuery = new Predicate<ScreenDefinition>(objQuery);
index = tmp.FindIndex(objQuery);

objQuery是对条件的查询

我尝试过更新

listJoinedScreenDefinition[index].fieldName = "update";

但问题是我需要根据我的逻辑动态生成'fieldName'

Say "seat" + 05 => seat05 is the column name.

就像明智的 seat1 - 座位100 一样。

在每次迭代中,我只需要更新一列。

在我尝试如何在该List中传递动态列名的方式?

我是.Net和Linq的新手。

请提出一些实现此目的的方法..

2 个答案:

答案 0 :(得分:4)

您的问题与列表和查询无关。如果您的clsTest课程只有一个实例,那么情况会相同。问题在于班级的设计。

如果我理解正确,clsTest有100名成员,其名称如seat1seat2seat50等,是否正确?如果是这样,那是一个非常糟糕的类设计,正如你已经发现的那样,因为它要求你硬编码对代码中特定字段的所有引用,或者交替使用反射(正如Garath在他的回答中所建议的那样),这是更复杂的容易出错。

更好的解决方案是重新设计clsTest课程,使其成为名为Seats的{​​{1}}或Array个席位。如果您有List,则可以访问public List<string> Seats {get;set;}以获得第五个席位。

当然,如果它不仅仅是一个座位列表,而且你可以有几种不同类型的编号属性(例如“座位”+“05”和“行”+“02”),你可以使用myObject.Seats[5],用于在“seat05”及其值之间进行映射。

答案 1 :(得分:0)

最简单的方法是使用反射。我不知道你是否在使用属性或字段。 对于属性代码将如下所示:

var target = listJoinedScreenDefinition[index];
Type type = target.GetType();
PropertyInfo prop = type.GetProperty("propertyName");
prop.SetValue (target, propertyValue, null);

对于字段代码非常相似:

var target = listJoinedScreenDefinition[index];
FieldInfo fi = target.GetType().GetField("Name", BindingFlags.NonPublic | BindingFlags.Instance);
fi.SetValue(target ,value)