列表不返回函数值

时间:2019-10-28 06:46:23

标签: c# .net

我正在使用以下方法获取列表。尽管“ 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);

我想念什么?

3 个答案:

答案 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);

更好的方法是从函数中返回列表。