0

与えられた 1 つのクラスのオブジェクトのリスト ( List<Type1>)

item1.isbool = true, beat = 1
item2.isbool = true, beat = 1.333
item3.isbool = true, beat = 1.666
item4.isbool = false, beat = 2
item5.isbool = false, beat = 3
item6.isbool = false, beat = 4
item7.isbool = false, beat = 5
item8.isbool = true, beat = 5.333
item9.isbool = true, beat = 5.666

List<Type2>.Add()連符グループ (可変サイズ) の開始値と終了値を取得して、2 番目のクラス ( )のリストに追加したいと考えています。

item1.tuplet = start
item3.tuplet = stop
item8.tuplet = start
item9.tuplet = stop

要素の順序は重要です。オプションとして MoreLinq がありますが、これらの値を取得するために実行する必要がある操作の種類は不明です。パーティションまたはある種の GroupBy のいずれかである可能性がありますが、それは機能していないようです。

最後に必要な最終結果は

List2.Add(new Object() {Tuplet = TupletType.Start});
List2.Add(new Object() {Tuplet = TupletType.None});
List2.Add(new Object() {Tuplet = TupletType.Stop});
List2.Add(new Object() {Tuplet = TupletType.None});
List2.Add(new Object() {Tuplet = TupletType.None});
List2.Add(new Object() {Tuplet = TupletType.None});
List2.Add(new Object() {Tuplet = TupletType.None});
List2.Add(new Object() {Tuplet = TupletType.Start});
List2.Add(new Object() {Tuplet = TupletType.Stop});
4

2 に答える 2

2

拡張メソッドを使用してグループ化を行うことができます。次に、次を使用できます。

List<Type1> runs = ...

List<Type2> grouped = new List<Type2>();
grouped.AddRange(runs.GroupByRuns());

拡張メソッドの可能な解決策は次のとおりです。

public static class GroupType
{
    public static IEnumerable<Type2> GroupByRuns(this IEnumerable<Type1> sequence)
    {
        if (sequence.Count() == 0)
            yield break;

        List<bool> next_items = sequence.Select(s => s.isbool).ToList();
        next_items.Add(false);

        bool previous_item = false;
        int idx = 1;
        foreach (var item in sequence)
        {
            if (item.isbool)
            {
                if (previous_item == false)
                {
                    yield return new Type2 { Tuple = Type2.TupletType.Start };
                }
                else if (next_items.ElementAt(idx) == true)
                {
                    yield return new Type2 { Tuple = Type2.TupletType.None };
                }
                else
                {
                    yield return new Type2 { Tuple = Type2.TupletType.Stop };
                }
            }
            else
            {
                yield return new Type2 { Tuple = Type2.TupletType.None };
            }
            previous_item = item.isbool;
            idx++;
        }
    }
}
于 2016-04-25T12:56:28.540 に答える
0

for ループを使用した例を次に示します。

Type1 start;
Type1 stop;

for (int i=0; i<list.Length; i++)
{
  if(start == null && list[i].isbool)
    start = item[i];
  if(start != null && (i+1 == list.Length) || !list[i+1].isbool)
  //no next item or next item is false? Found the stop.
  {
    stop = item[i];//Found a start & stop, add them to a list
    start = null;
  }
}
于 2016-04-25T12:24:19.377 に答える