【问题标题】:Spliting a int array on a specific element在特定元素上拆分 int 数组
【发布时间】:2021-12-15 04:20:15
【问题描述】:

所以我正在解决一些不相关的编码挑战,我需要根据一个元素拆分一个 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();
 }

这行得通(我认为),但它很乱,我不喜欢它

还有其他解决方案吗?

【问题讨论】:

    标签: c# arrays split


    【解决方案1】:

    一般情况下,您可以按如下方式实现它(String.Split 类似例程,但用于 IEnumerable&lt;T&gt;):

    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));
    

    【讨论】:

      【解决方案2】:
          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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多