2017-06-28 64 views
-1

我可能过度思考这个问题,但假设下面的类结构:最快的方式

public class Car { 
    public string Make {get;set;} 
    public string Model {get;set;} 
    public string Year {get;set;} 
} 

List<Car> MyCarList = new List<Car>(); 

MyCarList.Add(new Car(
Make = "Honda", 
Model = "Civic", 
Year = "1997" 
)); 

MyCarList.Add(new Car(
Make = "Ford", 
Model = "Tarus", 
Year = "2005" 
)); 

什么是去了解每个属性相结合的最快方式MyCarList的每个元素?

我想出的一个解决方案是重载类中的ToString()函数,并返回每个元素+属性值 - 但这让人感觉很乱。

另一个(不太优雅的)解决方案是简单地连接每个属性并手动构建。

我试图想出的解决方案是使用Lambda或LINQ,但最近我得到的只是类列表中的一个属性。

我也考虑过StringBuilder,但我不确定这是不是一个很好的选择这个问题。

输出将用于记录的目的,并连接值应该是这样的:

Make: Honda 
Model: Civic 
Year: 1997 

Make: Ford 
Model: Tarus 
Year: 2005 
+4

只有一条线路?在错误消息中显示它,记录它,在UI中显示它? _quickest_方式完全取决于你想要做的事情。 – JSteward

+1

“最好的方式”是基于意见的,除非你指定了“更好”的非常具体的标准。到目前为止,你有3个答案,以不能相互比较的方式解决问题的完全不同方面...... –

+0

@JSteward请参阅编辑答案。 – confusedandamused

回答

4

另一种非常简单的方法是你的对象转换为字符串与JSon.NET库。
这是什么是你想与连接的值做的代码

var car = new Car 
{ 
    Make = "Honda", 
    Model = "Civic", 
    Year = "1997" 
}; 

string result = JsonConvert.SerializeObject(car); 
Console.WriteLine(result); 

// output will be 
{"Make":"Honda","Model":"Civic","Year":"1997"} 
+0

我要去并提醒您的答案是正确的 - 因为它是最优雅的解决方案(即使它使用库)。我或多或少地寻找一种可能的替代方法来重载ToString()函数。如果你建议使用StringBuilder - 我会问为什么(它是更有效率还是更多的开销?)。反射似乎也有点矫枉过正。 – confusedandamused

+1

请注意微观优化。 StringBuilder与String有很长时间的争论,并且收益取决于数据量和使用量。当没有明确的性能问题需要解决时,我更愿意使用更清晰易懂的代码。当连接字符串很多时,通常应该使用StringBuilder。可以找到一些背景搜索_StringBuilder Performance_ – Steve

1

这可以通过使用反射来完成。退房Type.GetProperties

例子:

var car = new Car 
{ 
    Make = "Honda", 
    Model = "Civic", 
    Year = "1997" 
}; 

var builder = new StringBuilder(); 
foreach (PropertyInfo info in car.GetType().GetProperties()) 
{ 
    if (builder.Length > 0) 
    { 
     builder.Append(", "); 
    } 

    var value = info.GetValue(car, null) ?? "null"; 
    builder.Append(info.Name); 
    builder.Append(" = "); 
    builder.Append(value); 
} 

Console.WriteLine(builder.ToString()); // "Make = Honda, Model = Civic, Year = 1997" 
+0

为什么使用反射,当你可以简单地写一个ToString覆盖,做同样的事情? – Steve

+1

握住手机,有更好的方法来做到这一点?我一直在使用这段代码进行调试的时间最长,我对看到这个感兴趣。编辑:@Steve我可以澄清你的意思,你是否只是硬编码值? –

+0

我的意思是,如果目的是为Car类获取一个字符串,并将所有属性值连接在一起,那么只需添加ToString的重写并编写转储属性的特定代码就不需要反射开销。 (或Json.NET在我的答案) – Steve

0
var props = typeof(Car).GetProperties(); 
var stb = new StringBuilder(); 
foreach (var element in MyCarList) 
{ 
    foreach (var prop in props) 
    { 
     stb.Append(prop.Name); 
     stb.Append(": "); 
     stb.Append(prop.GetValue(element)); 
     stb.AppendLine(); 
    } 
    stb.AppendLine("--------------------------"); 
} 

结果。

Make: Honda 
Model: Civic 
Year: 1997 
-------------------------- 
Make: Ford 
Model: Tarus 
Year: 2005 
--------------------------