我正在嘗試將List<int>數百個整數轉換為一個字串,該字串在列印時每行具有指定數量的整數。我還在輸出中的每個整數之間放置了“,”,并放置了左括號和右括號。如果 List 的 Count 不是每行專案數的倍數,則最后一行的專案少于前幾行。例如,如果 List 有 49 個整數,并且呼叫該方法在每行放置 11 個專案,則輸出字串在列印時將如下所示:
[3397, 3398, 3401, 3403, 3409, 3415, 3418, 3419, 3421, 3427, 3431,
3437, 3439, 3442, 3443, 3446, 3453, 3455, 3459, 3466, 3473, 3481,
3482, 3487, 3489, 3493, 3494, 3497, 3503, 3505, 3506, 3513, 3518,
3521, 3523, 3543, 3545, 3551, 3554, 3561, 3563, 3566, 3569, 3574,
3578, 3579, 3587, 3589, 3595]
我已經撰寫了一個方法來執行此操作,并且輸出看起來很棒,但是我覺得我的代碼可能遇到了意大利面條/jank 問題。有沒有更好的方法來做到這一點,使用更少的代碼行并使用 StringBuilder 而不是字串連接?
public static string MakeBigStringFromList(List<int> input,
int itemsPerLine)
{
int length = input.Count;
List<int>.Enumerator intEnumerator = input.GetEnumerator();
string bigReturnString = "[";
if (length > 0)
{
intEnumerator.MoveNext();
bigReturnString = intEnumerator.Current.ToString();
if (length > 1)
{
bigReturnString = ", ";
}
}
int firstTime = 1;
int i = 1;
while (i < length)
{
string line = "";
int j = 0 firstTime;
if (i itemsPerLine < length)
{
while (j < itemsPerLine)
{
intEnumerator.MoveNext();
line = intEnumerator.Current.ToString() ", ";
i ;
j ;
}
bigReturnString = line "\n";
firstTime = 0;
}
else
{
while (i < (length - 1))
{
intEnumerator.MoveNext();
line = intEnumerator.Current.ToString() ", ";
i ;
}
intEnumerator.MoveNext();
line = intEnumerator.Current.ToString();
i ;
bigReturnString = line;
intEnumerator.Dispose();
}
}
bigReturnString = "]";
return bigReturnString;
}
uj5u.com熱心網友回復:
是的,你可以讓它“一點點”更短、更易讀,例如使用 LINQ
var intsPerLine = list.Select((i, index) => (Integer: i, Index: index))
.GroupBy(x => x.Index / 11, x => x.Integer.ToString())
.Select(g => string.Join(", ", g) ",");
string result = $"[{string.Join(Environment.NewLine, intsPerLine).TrimEnd(',')}]";
String.Join正在使用StringBuilder引擎蓋下的,所以這不是低效的。
說明: 將所有ints 用整數除法分組為 11 個包,選擇 int 作為字串:
GroupBy(x => x.Index / 11, x => x.Integer.ToString())
這些 11int與逗號連接,因此您會得到多個字串:
Select(g => string.Join(", ", g) ",")
通過String.Join在這些行字串上使用Environment.NewLine. 最后一個逗號被洗掉,然后用括號括起來:
$"[{string.Join(Environment.NewLine, intsPerLine).TrimEnd(',')}]
結果和你的一樣(除了你用的"\n"和我用的Environment.NewLine)。
uj5u.com熱心網友回復:
如果您使用的是 .NET6,則可以使用Chunk LINQ 方法:
string BuildString(IEnumerable<int> list, int countPerLine)
{
return "["
string.Join(Environment.NewLine,
list.Chunk(countPerLine).Select(c => string.Join(", ", c) ","))
.TrimEnd(',')
"]";
}
塊將輸入分成最多countPerLine元素的子序列。然后string.Join(", ", c) ","從每個子序列中創建一條線,最后string.Join(Environment.NewLine, ...)將這些線組合起來。
uj5u.com熱心網友回復:
試試這個,將值從整數串列轉換為字串串列。
List<string> sLst = iLst.ConvertAll<string>(delegate (int i) { return
i.ToString(); });
可以通過轉換為陣列并顯示它來列印捕獲串列范圍的值,
Console.WriteLine(String.Join(",", sLst.GetRange(j, 11).ToArray()));
uj5u.com熱心網友回復:
不使用任何 FANCY...
public static string MakeBigStringFromList(List<int> input, int itemsPerLine)
{
StringBuilder sb = new StringBuilder("[");
for(int i=0; i<input.Count; i )
{
sb.Append(input[i]);
if ((i 1) != input.Count)
{
sb.Append(", ");
if ((i 1) % itemsPerLine == 0)
{
sb.Append(Environment.NewLine);
}
}
}
sb.Append("]");
return sb.ToString();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/429466.html
