我已经在stackoverflow中搜索了类似的内容,并且无法找到任何会给我一些提示的内容。
我有以下代码:
DATA val1 = new DATA();
val1.Name = "KeyValue";
val1.Value = "805373069";
DATA val2 = new DATA();
val2.Name = "Tel";
val2.Value = "0123456789";
DATA val3 = new DATA();
val3.Name = "TargetID";
val3.Value = "43301";
DATA val4 = new DATA();
val4.Name = "ServiceLevel";
val4.Value = "Y";
DATA val5 = new DATA();
val5.Name = "TypeId";
val5.Value = "13505";
DATA val6 = new DATA();
val6.Name = "DateTime";
val6.Value = System.DateTime.Now.ToString("ddMMyyyyHHmmssffftt");
DATA val7 = new DATA();
val7.Name = "DbDateTime";
val7.Value = System.DateTime.Now.ToString("ddMMyyyyHHmmssffftt");
一旦填充了所有对象,我就把它们放在单个数组中。 即在其他地方使用
DATA [] array = {val1,val2,val3,val4,val5,val6,val7};
和我无法改变的代理类是:
public partial class DATA {
private string nameField;
private string valueField;
public string Name {
get {
return this.nameField;
}
set {
this.nameField = value;
this.RaisePropertyChanged("Name");
}
}
public string Value {
get {
return this.valueField;
}
set {
this.valueField = value;
this.RaisePropertyChanged("Value");
}
}
现在我尝试过但未能使它更容易使用字典和锯齿状数组和多维数组,它没有像我希望的那样工作。
有人可以给我一些更好的解决方案,然后创建7个不同的对象,因为这个数据是动态的,我必须做这个运行时数据填充。
建议吗?
答案 0 :(得分:3)
如果要确保名称不能重复,请将所有数据放入字典中:
var data = new Dictionary<string, string>();
// fill dictionary:
data.Add("name1", /*value*/);
data.Add("name2", /*value*/);
data.Add("name3", /*value*/);
data.Add("name4", /*value*/);
然后将其转换为数组:
return data.Select(d => new Data(){ Name = d.Key, Value = d.Value}).ToArray();
确保您已将using System.Linq
添加到顶部。
<强>更新强>: 正如@LukeH建议的那样,您可以像这样简单地使用collection initializer:
var data = new Data[]
{
new Data(){ Name = "Sylvester", Value = /*value*/ },
new Data(){ Name = "Whiskers", Value = /*value*/ },
new Data(){ Name = "Sasha", Value = /*value*/ }
};
这不会阻止Data
类型实例的重复名称。
答案 1 :(得分:3)
你可以直接将对象声明为数组声明的一部分,如果您要做的就是避免使用变量:
DATA[] array = {
new DATA { Name = "something", Value = "something else" },
new DATA { Name = "something", Value = "something else" },
new DATA { Name = "something", Value = "something else" },
new DATA { Name = "something", Value = "something else" }
};
您拥有变量的任何地方,您都可以使用创建该变量的操作。操作顺序将导致对同一事物的评估。您需要变量的地方是您希望多次使用相同的实例,或者无需重新计算它的相同值。
答案 2 :(得分:1)
您可以创建extension method这样的内容来克服分配属性值而不是重复的问题,
static class Extensions
{
public static void AddDataObject(this List<DATA> dataList, params string[] values)
{
dataList.Add(new DATA() { Name = values[0], Value = values[1] });
}
}
并按照下面给出的值传递
List<DATA> dataList = new List<DATA>();
dataList.AddDataObject("KeyValue", "805373069");
dataList.AddDataObject("Tel", "0123456789");
在上面的示例中,我使用了List而不是数组,您可以根据需要进行更改
答案 3 :(得分:0)
您可以初始化一个匿名对象,然后转换为这样的数据数组:
var data = new {
KeyValue="805373069",
Tel="0123456789",
TargetID="43301",
ServiceLevel="Y",
TypeId="13505",
DateTime=System.DateTime.Now.ToString("ddMMyyyyHHmmssffftt"),
DbDateTime=System.DateTime.Now.ToString("ddMMyyyyHHmmssffftt")
};
var array = data.GetType()
.GetProperties()
.Select(x=>new DATA{Name=x.Name,Value=(string)x.GetValue(data)})
.ToArray();
你也可以这样做:
var data = new {
KeyValue="805373069",
Tel="0123456789",
TargetID="43301",
ServiceLevel="Y",
TypeId="13505",
DateTime=System.DateTime.Now.ToString("ddMMyyyyHHmmssffftt"),
DbDateTime=System.DateTime.Now.ToString("ddMMyyyyHHmmssffftt")
};
var array=System.Web.Mvc.HtmlHelper.AnonymousObjectToHtmlAttributes(data)
.Select(x=>new DATA {Name=x.Key,Value=(string)x.Value})
.ToArray();
如果您需要获取一组数据并将其转换回类对象(非匿名),您可以执行第一种方法,也可以反过来。或者在其上放置扩展方法以从/向您的数据数组转换。
static class Extensions
{
public static DATA[] ToDataArray(this object data)
{
return data.GetType()
.GetProperties()
.Select(x=>new DATA{Name=x.Name,Value=(string)x.GetValue(data)})
.ToArray();
}
}
var data = new {
KeyValue="805373069",
Tel="0123456789",
TargetID="43301",
ServiceLevel="Y",
TypeId="13505",
DateTime=System.DateTime.Now.ToString("ddMMyyyyHHmmssffftt"),
DbDateTime=System.DateTime.Now.ToString("ddMMyyyyHHmmssffftt")
};
var array=data.ToDataArray();
然而,大卫的答案更好。