[英]Iterate over items in Tuple
我有三個循環的方法:
public void Print(Tuple<List<DateTime>, List<double>, List<string>> dataToPrint)
{
foreach (var item in dataToPrint.Item1)
{
Console.WriteLine(item);
}
foreach (var item in dataToPrint.Item2)
{
Console.WriteLine(item);
}
foreach (var item in dataToPrint.Item3)
{
Console.WriteLine(item);
}
}
是否可以只使用一個循環來打印屏幕上列表內容的所有項目?
當然,您可以將所有列表連接成一個object
或string
項目序列,但這種串聯不會使您的代碼更具可讀性。 但您可以創建簡單的擴展方法,將任何序列的內容轉儲到控制台:
public static void Dump<T>(this IEnumerable<T> source)
{
foreach(var item in source)
Console.WriteLine(item);
}
你的代碼看起來像(根本沒有循環):
public void Print(Tuple<List<DateTime>, List<double>, List<string>> dataToPrint)
{
dataToPrint.Item1.Dump();
dataToPrint.Item2.Dump();
dataToPrint.Item3.Dump();
}
我還將使用命名參數,自定義類型或值元組將這三個值傳遞給方法。
是的,但您必須確保所有列表具有相同的長度。
你基本上可以這樣做:
for (var i = 0; i < dataToPrint.Item1.Length; i++)
{
Console.WriteLine(dataToPrint.Item1[i]);
Console.WriteLine(dataToPrint.Item2[i]);
Console.WriteLine(dataToPrint.Item3[i]);
}
編輯:在日期時間列表上調用ForEach(Console.WriteLine)實際上不會起作用,因為Console.WriteLine沒有特定的覆蓋,該覆蓋需要一個日期時間,它只使用獲取對象的覆蓋。 由於List.ForEach期望一個Action和編寫日期時間所需的Console.WriteLine方法實際上是一個Action,這段代碼不會編譯,所以這個答案是不正確的。 但是我覺得它很有意思,為什么它不會工作,所以我會留在這里
我不確定為什么你的代碼有問題。 如果那是方法的簽名而你無法改變它那么對我來說似乎是有效的。 如果由於某種原因你真的想限制你的行代碼,你可以這樣做
dataToPrint.Item1.ForEach(Console.WriteLine);
dataToPrint.Item2.ForEach(Console.WriteLine);
dataToPrint.Item3.ForEach(Console.WriteLine);
其他一些人建議所有列表的for循環長度相同但這將以與您描述的順序不同的順序打印出來。 並將所有列表中的所有項目轉換為對象,因此您可以將列表設置為高成本,這要歸功於將值類型設置為double。 編輯:我已經被告知,與寫入控制台的性能相比,拳擊可能是微不足道的。 然而,我仍然認為將它們全部投射到對象不是最好的選擇,但那只是我
嘗試這個:
foreach (var element in dataToPrint.Item1.Cast<object>().Concat(dataToPrint.Item2.Cast<object>()).Concat(dataToPrint.Item3.Cast<object>()))
{
Console.WriteLine(element);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.