0

我有以下课程:

  • 标识整数
  • 活动布尔
  • 日期时间日期时间
  • 批准的布尔值

我有与此类似的该类的列表:

  • 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

我想通过Approved从列表组中获取项目,但我希望分组对象按以下顺序排列:

  • 所有对象,直到第一个假。
  • 所有对象直到下一个真。
  • 所有对象直到下一个假。
  • 所有对象直到下一个真。

提前致谢

4

2 回答 2

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 回答
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 回答