2017-10-05 9 views
-2

intアレイを連続した数値シーケンスに基づいて新しい配列に分割する簡単な方法(linq?)はありますか?値を配列順に分割する

[Fact] 
public void ArraySpike() 
{ 
    var source = new[] {1, 2, 3, 7, 8, 9, 12, 13, 24}; 

    var results = SplitArray(source); 

    Assert.True(results[0] == new[] {1, 2, 3}); 
    Assert.True(results[1] == new[] {7, 8, 9}); 
    Assert.True(results[2] == new[] {12, 13}); 
    Assert.True(results[3] == new[] {24}); 
} 

public int[][] SplitArray(int[] source) 
{ 
    return source.??? 
} 
+0

を追加し、ユニークな注文とされていると仮定? 5桁ごとに? (1-5,6-10,11-15など)? – Igor

+0

冗談ではないので、グループ1 = 1,2,3グループ2 = 7,8,9グループ3 = 12,13グループ4 = 24 – mxmissile

+1

ああ、それはただの偶然だった。 – Igor

答えて

1

これは、LINQの拡張Aggregateで作業することができます彼らは1の違いがある場合

あなたの配列要素が接続されています。私の播種は非常にエレガントではありませんしかし、変更するのは簡単です。 results変数には配列の配列が含まれ、実際には配列[]が常に固定サイズの関数で簡単に拡張できるため、型はList<T>です。

また、これはそれが当てはまらない場合は、ソースはすでにグループを構成する何.OrderBy(x => x).Distinct()

var source = new[] { 1, 2, 3, 7, 8, 9, 12, 13, 24 }; 
var results = new List<List<int>>{new List<int>()}; 

var temp = source.Aggregate(results[0], (b, c) => 
{ 
    if (b.Count > 0 && b.Last() != c - 1) 
    { 
     b = new List<int>(); 
     results.Add(b); 
    } 
    b.Add(c); 
    return b; 
}); 
1

私は私の個人的なコレクションから、この拡張メソッドを掘っ:

public static IEnumerable<IEnumerable<T>> GroupConnected<T>(this IEnumerable<T> list, Func<T,T,bool> connectionCondition) 
{ 
    if (list == null) 
    { 
     yield break; 
    } 
    using (var enumerator = list.GetEnumerator()) 
    { 
     T prev = default(T); 
     var temp = new List<T>(); 
     while (enumerator.MoveNext()) 
     { 
      T curr = enumerator.Current; 
      { 
       if(!prev.Equals(default(T)) && !connectionCondition(prev, curr)) 
       { 
        yield return temp; 
        temp = new List<T>(); 
       } 
       temp.Add(curr); 
      } 
      prev = curr; 
     } 
     yield return temp; 
    } 
} 

それは、より一般的な意味で問題を解決します。たとえば、この擬似コードを与えられた要素のサブシーケンスを分割何らかの形で「接続」されています。シーケンスを走査し、次の項目が「接続されていない」まで一時的なリストの各要素を収集します。次に、一時的なリストを返し、新しいリストを開始します。

var results = source.GroupConnected((a,b) => b - a == 1); 
関連する問題