连接一个班级的所有成员

时间:2017-02-25 01:22:34

标签: c#

我很难编写一些我确信可以做得更聪明的东西 - 有趣的小问题 - 使用c#6.0

我怎样才能减少这种情况 - 再过20行。

  string fullLine = newLine.col1_index_no +
            newLine.col2_depot_custRef +
            newLine.col3_depot_no +
            newLine.col4_driver_id +
            newLine.col5_vehicle_id +
            newLine.col6_trans_type;

如果有帮助的话就是这个班级:

class lineBuilder
{
    public string col1_index_no { get; set; }
    public string col2_depot_custRef { get; set; }
    public string col3_depot_no { get; set; }
    public string col4_driver_id { get; set; }
    public string col5_vehicle_id { get; set; }
    public string col6_trans_type { get; set; }
    public string col7_sign_id { get; set; }
    public string col8_note_id { get; set; }
    public string col9_route_code { get; set; }
    public string col10_RA_no { get; set; }
    public string col11_doc_type { get; set; }
    public string col12_user_gen_flag { get; set; }
    public string col13_seq_no { get; set; }
    public string col14_pallet_id { get; set; }
    public string col15_tote_id { get; set; }
    public string col16_adj_type { get; set; }
    public string col17_rtn_sig_not_avlb { get; set; }
    public string col18_scan_dateTime { get; set; }
    public string col19_scan_in_time { get; set; }
    public string col20_AX_status { get; set; }

}

1 个答案:

答案 0 :(得分:1)

你可以通过反思来做到这一点。此示例代码将按字母顺序打印出所有属性:

var lb = new lineBuilder
{
    col1_index_no = "item one",
    col2_depot_custRef = "item depot custRef"
    col10_RA_no = "further values will not make this explanation any clearer"
};

StringBuilder sb = new StringBuilder();
IEnumerable<PropertyInfo> properties = typeof(lineBuilder)
                                            .GetProperties()
                                            .Where(p => p.PropertyType.Equals(typeof(string)))
                                            .OrderBy(p => p.Name);

foreach(PropertyInfo propertyInfo in properties)
{
    var value = (string)propertyInfo.GetValue(lb);  
    sb.AppendLine(string.Format("{0}: {1}", propertyInfo.Name, value ?? String.Empty));
}

Console.WriteLine(sb.ToString());

但是,您不希望它们按字母顺序排列,您希望它们按数字顺序排列。

您需要一个不同的OrderBy子句。

如果您的所有属性名称都遵循格式col{number},则可以使用正则表达式从每个名称中提取数字,并使用它来执行排序。

Regex regex = new Regex(@"^col(\d+)");

IEnumerable<PropertyInfo> properties = typeof(lineBuilder)
                                            .GetProperties()
                                    .Where(p => p.PropertyType.Equals(typeof(string)))
                                    .OrderBy(p => int.Parse(regex.Match(p.Name).Groups[1].Value));