2017-06-28 63 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 
--------------------------