所以我正在解決一些不相關的編碼挑戰,我需要根據一個元素拆分一個 int 陣列。
類似于 String.Split 的作業方式。
例如:
var arr1 = new int [] { 3, 3, 0, 2, 4, 3, 2 };
var arr2 = new int [] { 8, 8, 5, 7, 9, 8, 7, 4, 8 };
var results1 = Split(arr1, 0);
foreach (var arr in results1)
Console.WriteLine(string.Join(",", arr));
var results2 = Split(arr2, 8);
foreach (var arr in results2)
Console.WriteLine(string.Join(",", arr));
這里的輸出是:
3,3
2,4,3,2
5,7,9
7,4
我很驚訝,我找不到任何答案,String.Split 不斷出現,但沒有整數!
所以我寫了這個:
public int[][] Split(int[] arr, int element)
{
List<int[]> arrays = new List<int[]>();
int skip = 0;
int take = 0;
for (int i = 0; i < arr.Length; i )
{
if (arr[i] == element && take != 0)
{
arrays.Add(arr.Skip(skip).Take(take).ToArray());
skip = i 1;
take = 0;
continue;
}
if (arr[i] != element)
take ;
if (take == 0)
skip = i 1;
if (arr.Length - 1 == i && take != 0)
arrays.Add(arr.Skip(skip).Take(take).ToArray());
}
return arrays.ToArray();
}
這有效(我認為),但它非常混亂,我不喜歡它
還有其他解決方案嗎?
uj5u.com熱心網友回復:
在一般情況下,您可以按如下方式實作它(String.Split如例程但 for IEnumerable<T>):
public static IEnumerable<T[]> Split<T>(IEnumerable<T> source,
T delimiter,
StringSplitOptions options = StringSplitOptions.None,
IEqualityComparer<T> comparer = null) {
if (null == source)
yield break; // Or throw new ArgumentNullException(nameof(source));
if (null == comparer)
comparer = EqualityComparer<T>.Default;
List<T> current = new List<T>();
foreach (T item in source) {
if (comparer.Equals(item, delimiter)) {
if (current.Count > 0 || !options.HasFlag(StringSplitOptions.RemoveEmptyEntries))
yield return current.ToArray();
current.Clear();
}
else
current.Add(item);
}
if (current.Count > 0 || !options.HasFlag(StringSplitOptions.RemoveEmptyEntries))
yield return current.ToArray();
}
然后
var arr1 = new int [] { 3, 3, 0, 2, 4, 3, 2 };
var results1 = Split(arr1, 0);
foreach (var arr in results1)
Console.WriteLine(string.Join(", ", arr));
uj5u.com熱心網友回復:
public static IEnumerable<List<TValue>> SplitBy<TValue>(List<TValue> source, TValue by)
{
int start = 0;
int count = 0;
foreach (TValue item in source)
{
if (item.Equals(by))
{
List<TValue> part = source.GetRange(start, count);
start = start count 1;
count = 0;
if (part.Any())
{
yield return part;
}
}
else
{
count ;
}
}
List<TValue> rest = source.GetRange(start, count);
yield return rest;
}
https://dotnetfiddle.net/Widget/Preview?url=/Widget/7ORu8p
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/342685.html
上一篇:從輸入(C)中找到最短的線
