0

私は次のクラスを持っています:

  • ID int
  • アクティブブール
  • 日時
  • 承認されたブール

私はこれに似たそのクラスのリストを持っています:

  • Id 1 アクティブtrue 承認済みtrue
  • Id 2 アクティブtrue 承認済みtrue
  • Id 3 アクティブtrue 承認済みtrue
  • Id 4 アクティブtrue 承認済みfalse
  • Id 5 アクティブtrue 承認済みfalse
  • Id 6 アクティブtrue 承認済みfalse
  • Id 7 アクティブtrue 承認済みtrue
  • Id 8 アクティブtrue 承認済みtrue
  • Id 9 アクティブtrue 承認済みfalse

承認済みのリスト グループからアイテムを取得したいのですが、グループ化されたオブジェクトを次の順序にしたい:

  • 最初の false まですべてのオブジェクトをtrueにします。
  • 次の true まで、すべてのオブジェクトをfalseにします。
  • 次の false まですべてのオブジェクトをtrueにします。
  • 次の true まで、すべてのオブジェクトをfalseにします。

前もって感謝します

4

2 に答える 2

0

これはうまくいくはずです:

var data = list.OrderBy(x => x.Id);
bool approved = data.First().Approved;
var groups = new List<Tuple<bool, List<Foo>>>();
var all = groups.SelectMany(x => x.Item2);

while (all.Count() != list.Count())
{
    groups.Add(
        Tuple.Create(
            approved
            , list.Skip(all.Count())
                  .TakeWhile(x => x.Approved == approved)
                  .ToList()));
    approved = !approved;
}

foreach (var grp in groups)
{
    Console.Write("Next block: {0} with {1} elements", grp.Item1, grp.Item2.Count);
}

これがあなたのクラスです:

class Foo
{
    public int Id { get; set; }
    public bool Active { get; set; }
    public DateTime datetime { get; set; }
    public bool Approved { get; set; }
}

およびサンプルデータ:

var list = new List<Foo>();
list.Add(new Foo() { Id = 1, Active = true, Approved = true });
list.Add(new Foo() { Id = 2, Active = true, Approved = true });
list.Add(new Foo() { Id = 3, Active = true, Approved = true });
list.Add(new Foo() { Id = 4, Active = true, Approved = false });
list.Add(new Foo() { Id = 5, Active = true, Approved = false });
list.Add(new Foo() { Id = 6, Active = true, Approved = false });
list.Add(new Foo() { Id = 7, Active = true, Approved = true });
list.Add(new Foo() { Id = 8, Active = true, Approved = true });
list.Add(new Foo() { Id = 9, Active = true, Approved = false });
于 2012-10-26T12:08:19.490 に答える
0

TakeWhile メソッドを使用する必要があるようです

http://msdn.microsoft.com/ru-ru/library/bb534804(v=vs.95).aspx

私は LINQ があまり得意ではありませんが、このコードは機能するはずです。この原則は、ブール値だけでなく、IEqualityComparer をサポートする任意の型にも拡張できます。

var list = new List<Test>();
list.Add(new Test(1, true, true));
list.Add(new Test(2, true, true));
list.Add(new Test(3, true, true));
list.Add(new Test(4, true, false));
list.Add(new Test(5, true, false));
list.Add(new Test(6, true, false));
list.Add(new Test(7, true, true));
list.Add(new Test(8, true, true));
list.Add(new Test(9, true, false));

var listTemp = list;
var result = new List<Tuple<bool, List<Test>>>();

while (listTemp.Count > 0)
{
    var approved = listTemp[0].Approved;
    var tuple = new Tuple<bool, List<Test>>(approved, listTemp.TakeWhile(x => approved == x.Approved).ToList());
    result.Add(tuple);
    listTemp = listTemp.SkipWhile(x => approved == x.Approved).ToList();
}
于 2012-10-26T10:16:18.113 に答える