【问题标题】:C# elegant way to assign properties values rather then duplicationC# 优雅的方式来分配属性值而不是重复
【发布时间】:2015-10-16 02:20:08
【问题描述】:

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

请给点建议?

【问题讨论】:

  • 如果它创建的运行时不能解决你的问题?您在 for 循环中创建对象并将它们添加到列表中。
  • 我不确定你在问什么。你能进一步解释一下吗?
  • 您可以使用对象初始化。前任。新数据(){名称=“废话,价值=“废话”}
  • 将值从字符串更改为对象。这样你就不必转换为对象,并且可以将值保持为其原始类型。
  • 同时下载 Resharper,它会向你推荐这个。

标签: c# linq c#-4.0


【解决方案1】:

如果您只想避免使用变量,则可以将对象内联声明为数组声明的一部分:

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" }
};

只要您有一个变量,您就可以使用创建该变量的操作。操作顺序将导致对同一事物的评估。你需要一个变量的地方是你想多次使用相同的instance,或者相同的值而不需要重新计算。

【讨论】:

    【解决方案2】:

    如果您想确保名称不能重复,请将所有数据放入字典中:

    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 类型实例的重复名称。

    【讨论】:

    • 您还可以通过使用集合初始化语法来填充字典来减少多余的代码。
    • 根据用例的不同,这有利于/不利地为 Data 数组结果强制执行唯一的 Name 值。如果在重复名称可能导致意外行为的某些功能中使用 Data 对象,这是很好的,因为它会在此之前创建一个有意义的异常。如果数据仅用于某些信息/报告目的,这很糟糕,其中允许重复名称(甚至常见)。
    【解决方案3】:

    您可以创建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而不是数组,你可以根据你的要求改变

    【讨论】:

    • 我很想使用这种方法,但问题是扩展方法必须在非泛型静态类中定义,而我的工作类是具有内部方法的泛型类。
    • 这里是link,了解如何在泛型类中添加扩展方法
    【解决方案4】:

    你可以初始化一个匿名对象,然后像这样转换成一个数据数组:

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

    不过,大卫的回答更好。

    【讨论】:

    • 这对我来说效果很好,因为您提供了大量示例,并且第一个和最后一个代码部分很棒。
    猜你喜欢
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多