C# 列表不返回函数的值

C# 列表不返回函数的值,c#,.net,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"

我使用下面的方法来获取列表。虽然“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);

我遗漏了什么?

这是因为您正在方法中创建一个新列表

为了支持这一点,您需要使用ref关键字:


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

这是因为您正在方法中创建一个新列表

为了支持这一点,您需要使用ref关键字:

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

因为您正在将lc分配给一个新对象,这就是为什么调用方调用程序上的引用仍然指向列表的旧地址。要解决这个问题,您应该从assignList方法返回列表,或者通过引用使用列表

解决方案1:返回列表

公共列表assignListList lc、数据表dtMetric、字符串metricname { lc=来自dtMetric.AsEnumerable中的dr1 其中dr1.FieldMETRIC_NAME==metricname orderby dr1[样本时间]递增 选择新列表\u图表 { 采样时间=dr1.FIELD采样时间, Value=dr1.Fieldvalue }托利斯特先生; 返回信用证; } 解决方案1.1如果您希望保持信用证记录完整,请使用以下方法:

public void assignListList lc、DataTable dtMetric、string metricname { var结果=来自dtMetric.AsEnumerable中的dr1 其中dr1.FieldMETRIC_NAME==metricname orderby dr1[样本时间]递增 选择新列表\u图表 { 采样时间=dr1.FIELD采样时间, Value=dr1.Fieldvalue }托利斯特先生; 立法会:选举结果;; } 解决方案2:通过引用列出

public void assignListref列表lc、数据表dtMetric、字符串metricname { lc=来自dtMetric.AsEnumerable中的dr1 其中dr1.FieldMETRIC_NAME==metricname orderby dr1[样本时间]递增 选择新列表\u图表 { 采样时间=dr1.FIELD采样时间, Value=dr1.Fieldvalue }托利斯特先生; } 我建议您使用解决方案1。

因为您正在将lc分配给一个新对象,这就是为什么在调用者调用程序上,引用仍然指向列表的旧地址。要解决这个问题,您应该从assignList方法返回列表,或者通过引用使用列表

解决方案1:返回列表

公共列表assignListList lc、数据表dtMetric、字符串metricname { lc=来自dtMetric.AsEnumerable中的dr1 其中dr1.FieldMETRIC_NAME==metricname orderby dr1[样本时间]递增 选择新列表\u图表 { 采样时间=dr1.FIELD采样时间, Value=dr1.Fieldvalue }托利斯特先生; 返回信用证; } 解决方案1.1如果您希望保持信用证记录完整,请使用以下方法:

public void assignListList lc、DataTable dtMetric、string metricname { var结果=来自dtMetric.AsEnumerable中的dr1 其中dr1.FieldMETRIC_NAME==metricname orderby dr1[样本时间]递增 选择新列表\u图表 { 采样时间=dr1.FIELD采样时间, Value=dr1.Fieldvalue }托利斯特先生; 立法会:选举结果;; } 解决方案2:通过引用列出

public void assignListref列表lc、数据表dtMetric、字符串metricname { lc=来自dtMetric.AsEnumerable中的dr1 其中dr1.FieldMETRIC_NAME==metricname orderby dr1[样本时间]递增 选择新列表\u图表 { 采样时间=dr1.FIELD采样时间, Value=dr1.Fieldvalue }托利斯特先生; }
我建议您使用解决方案1。

如果您只是通过添加项目来修改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);

如果您只是通过添加项目来修改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);

解决方案1远远优于解决方案2,如果可能的话,您不应该使用ref关键字。为了进一步阅读,约翰·斯基特:完全同意。我还推荐解决方案1。旁注:在解决方案2中,我们不使用lc,但返回干燥的解决方案1,但它不起作用。即使lc有100条记录,listchart1也有0条记录。dtMetric有记录吗?由于您希望将记录从dtMetric添加到lc,并保持其记录的完整性?解决方案1远优于解决方案2,因此如果不使用out,则不应使用ref关键字。为了进一步阅读,约翰·斯基特:完全同意。我还推荐解决方案1。旁注:在解决方案2中,我们不使用lc,但返回干燥的解决方案1,但它不起作用。 即使lc有100条记录,listchart1也有0条记录。dtMetric有记录吗?您希望将记录从dtMetric添加到lc,并保持其记录完整吗?