我正在从视图中读取数据到列表中的项目。每个项目都是一个字符串和三个双打:
public class StatReportDataItems
{
public string Label { get; set; }
public double NumData1 { get; set; }
public double NumData2 { get; set; }
public double NumData3 { get; set; }
}
这是包含该列表的类:
public class StatReportDataModel
{
public string SReportType { get; set; }
public int numdatas { get; set; }
public List<StatReportDataItems> StatReportDataList { get; set; }
public string ReportTitle { get; set; }
}
将数据读取到列表的众多例程之一:
public List<StatReportDataItems> GetReport888()
{
var query = from rv in ProcessDB.Report888Views
select new StatReportDataItems
{
Label = rv.Label,
NumData1 = (double)rv.NumData1
};
var retValue = query.ToList();
return retValue;
} // GetReport888
一些例程还会将数据填充到 NumData2 和 Numdata3 中,然后有一个使用 chart.js 显示数据的通用例程。
最初只是“显示”,但现在在通用显示例程到达之前,应该对数据做越来越多的事情。由于这包括遍历数据,如果三个 Numdata 是一个包含三个项目的数组/列表/集合(将来可能会更多),它会使代码变得更好。
由于返回数组被视为一个很大的禁忌,我认为我应该使用索引属性。这将是一个开始:
public class Constants
{
public static int AntalData = 3;
}
public class NumDataType
{
private double[] numarr = new double[Constants.AntalData];
public int Length
{
get { return numarr.Length; }
}
public double this[int index]
{
get { return numarr[index]; }
set { numarr[index] = value; }
}
}
在我的应用程序中直接使用这个 NumDataType 会很容易:
NumDataType NumItems = new NumDataType();
NumItems[0] = 3.14;
但是,当我尝试在我的类 StatReportDataItems 中使用它然后替换
NumData1 = (double)rv.NumData1
在 GetReport888 中,我无法让它工作,尝试不同的代码编写方式。我经常收到编译器错误“当前上下文中不存在名称‘NumData’”
具有更改的 NumData 的 StatReportDataItems 类:
public class StatReportDataItems
{
public string Label { get; set; }
public NumDataType NumData { get; } = new NumDataType();
}
那么,我做错了什么?也许现在是我回家的时候了,明天我会看得更清楚,但我认为一些帮助是一个更安全的赌注......
由于一些评论者似乎在阅读我所写的内容时遇到问题,因此我尝试在此澄清:
一切正常,但我可以看到将 Numdata1 - Numdata3 更改为具有三个项目的 NumData[] 将简化一般的 js 代码。所以我想我应该做这个看似简单的改变。只有两个地方...
所以我创建了 NumDataType 并用该类型的一个属性替换了 StatReportDataItems 中的三个双属性。然后我将 GetReport888 更改为:
public List<StatReportDataItems> GetReport888()
{
var query = from rv in ProcessDB.Report888Views
select new StatReportDataItems
{
Label = rv.Label,
NumData[0] = (double)rv.NumData1
};
var retValue = query.ToList();
return retValue;
} // GetReport888
如果我做错了什么,我准备可能会收到一些“无法隐式转换......”类型的错误消息,而不是“当前上下文中不存在名称'NumData'”......
这是从 DB 视图生成的 Report888View 类:
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Report888View")]
public partial class Report888View
{
private string _Label;
private System.Nullable<double> _NumData1;
public Report888View()
{
}
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_Label", DbType="VarChar(100)")]
public string Label
{
get
{
return this._Label;
}
set
{
if ((this._Label != value))
{
this._Label = value;
}
}
}
[global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_NumData1", DbType="Float")]
public System.Nullable<double> NumData1
{
get
{
return this._NumData1;
}
set
{
if ((this._NumData1 != value))
{
this._NumData1 = value;
}
}
}
}
那么,为什么我会收到此特定错误?
编辑:在@howcheng 的帮助下,我得到了最终的 GetReport888:
public List<StatReportDataItems> GetReport888()
{
List<StatReportDataItems> retValue = new List<StatReportDataItems>();
fullmaktnodenProcessDB.Report888Views.ToList().ForEach(rv =>
{
StatReportDataItems data = new StatReportDataItems
{
Label = rv.Label,
NumData = new List<double> {
(double)(rv.NumData1 == null ? 0.0 : rv.NumData1)
},
};
retValue.Add(data);
});
return retValue;
}
您得到“当前上下文中不存在名称‘NumData’”的原因是,当您使用对象初始化来填充您的对象时,您只能使用属性设置器并且您的NumData
属性是只读的。但是即使您将其设置为可设置,您仍然无法直接使用索引器,因为您只能设置属性本身。
(旁注:您可以在初始化程序中使用索引器,但前提是索引器位于对象本身上(即,this[int index]
)。请参阅https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes -and-structs/how-to-initialize-objects-by-using-an-object-initializer了解详情。)
同时,假设您必须使用Report888View
该类,并结合我上面关于 using 的评论IEnumerable<double>
,那么这将起作用:
public class StatReportDataItems
{
public StatReportDataItems()
{
NumData = new List<double>();
}
public string Label { get; set; }
public IEnumerable<double> NumData { get; set; }
}
public List<StatReportDataItems> GetReport888()
{
var query = from rv in ProcessDB.Report888Views
select new StatReportDataItems
{
Label = rv.Label,
NumData = new List<double> { rv.NumData1, rv.NumData2, rv.NumData3 },
};
var retValue = query.ToList();
return retValue;
} // GetReport888
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句