我正在使用以下方法获取列表。尽管“ lc”上有记录,但它不会传递到列表中。
public void assignList(List<list_chart> lc, DataTable dtMetric, string metricname)
{
lc = (from dr1 in dtMetric.AsEnumerable()
where dr1.Field<string>("METRIC_NAME") == metricname
orderby dr1["SAMPLE_TIME"] ascending
select new list_chart
{
SAMPLE_TIME = dr1.Field<DateTime>("SAMPLE_TIME"),
Value = dr1.Field<decimal>("value")
}).ToList();
}
//lc has 100 records but listchart1 still shows 0 after i call method.
assignList(listchart1, dtMetric1, ucMetrics.CheckedItems[0].DisplayText);
我想念什么?
答案 0 :(得分:3)
由于您要向新对象分配lc
,因此在调用方调用程序上引用仍指向列表的旧地址。要解决此问题,您应该从assignList方法返回list
,或者使用引用列表。
解决方案1:(返回列表)
public List<list_chart> assignList(List<list_chart> lc, DataTable dtMetric, string metricname)
{
lc = (from dr1 in dtMetric.AsEnumerable()
where dr1.Field<string>("METRIC_NAME") == metricname
orderby dr1["SAMPLE_TIME"] ascending
select new list_chart
{
SAMPLE_TIME = dr1.Field<DateTime>("SAMPLE_TIME"),
Value = dr1.Field<decimal>("value")
}).ToList();
return lc;
}
解决方案1.1 如果要保留lc
的记录不变,请使用以下方法:
public void assignList(List<list_chart> lc, DataTable dtMetric, string metricname)
{
var result = (from dr1 in dtMetric.AsEnumerable()
where dr1.Field<string>("METRIC_NAME") == metricname
orderby dr1["SAMPLE_TIME"] ascending
select new list_chart
{
SAMPLE_TIME = dr1.Field<DateTime>("SAMPLE_TIME"),
Value = dr1.Field<decimal>("value")
}).ToList();
lc.AddRange(result);
}
解决方案2:(按引用列出)
public void assignList(ref List<list_chart> lc, DataTable dtMetric, string metricname)
{
lc = (from dr1 in dtMetric.AsEnumerable()
where dr1.Field<string>("METRIC_NAME") == metricname
orderby dr1["SAMPLE_TIME"] ascending
select new list_chart
{
SAMPLE_TIME = dr1.Field<DateTime>("SAMPLE_TIME"),
Value = dr1.Field<decimal>("value")
}).ToList();
}
我建议您使用解决方案1 。
答案 1 :(得分:2)
如果您只是通过添加项目来修改LC,那将是可行的。现在,您正在更换。这意味着AssignList只是具有不同的引用(对新创建的列表的引用)。
只需返回lc或在lc之前使用ref关键字。
public List<list_chart> assignList(DataTable dtMetric, string metricname)
{
lc = (from dr1 in dtMetric.AsEnumerable()
where dr1.Field<string>("METRIC_NAME") == metricname
orderby dr1["SAMPLE_TIME"] ascending
select new list_chart
{
SAMPLE_TIME = dr1.Field<DateTime>("SAMPLE_TIME"),
Value = dr1.Field<decimal>("value")
}).ToList();
return lc;
}
//lc has 100 records but listchart1 still shows 0 after i call method.
listchart1 = assignList(dtMetric1, ucMetrics.CheckedItems[0].DisplayText);
答案 2 :(得分:1)
那是因为您正在方法中创建一个新列表。
为了支持这一点,您需要使用ref
关键字:
public void assignList(ref List<list_chart> lc, DataTable dtMetric, string metricname)
{
lc = (from dr1 in dtMetric.AsEnumerable()
where dr1.Field<string>("METRIC_NAME") == metricname
orderby dr1["SAMPLE_TIME"] ascending
select new list_chart
{
SAMPLE_TIME = dr1.Field<DateTime>("SAMPLE_TIME"),
Value = dr1.Field<decimal>("value")
}).ToList();
}
//lc has 100 records but listchart1 still shows 0 after i call method.
assignList(ref listchart1, dtMetric1, ucMetrics.CheckedItems[0].DisplayText);
更好的方法是从函数中返回列表。