C#优雅的方式来分配属性值而不是重复

时间:2015-10-15 16:52:51

标签: c# linq c#-4.0

我已经在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个不同的对象,因为这个数据是动态的,我必须做这个运行时数据填充。

建议吗?

4 个答案:

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

然而,大卫的答案更好。