Linq查询甚至考虑记录并跳过奇数记录

时间:2017-04-07 16:24:29

标签: c# linq

以下是我的模特:

public class MyData
{
    public int RegionId { get; set; }
    public string Region { get; set; }
    public List<Test> Tests { get; set; }
}

public class Test
{
    public int? TestId { get; set; }
    public List<SubTest> SubTests { get; set; }
}

以下是我的方法:

private void MyMethod(int testId, int lastTestId)
{
    var list = new List<MyData>();//contains some records
    if (testId == 0)
    {
        var test1 = list[0].Tests[0];
        var test2 = list[0].Tests[1];
        var regionIds = new List<int>();
        int counter = 0;
        foreach (var item in list)
        {
            counter = 0;
            foreach (var test in item.Tests)
            {
                if (test.SubTests.Count != 0 && counter % 2 != 0)
                    regionIds.Add(item.RegionId);

                counter++;
            }
        }
    }
    else
    {
        var test1 = list[0].Tests[0];
        var regionIds = new List<int>();
        foreach (var item in list)
        {
            counter = 0;
            foreach (var test in item.Tests)
            {
                if (test.SubTests.Count != 0)
                    regionIds.Add(item.RegionId);

                counter++;
            }
        }
    }
}

在上面的方法中,当testId为0时,我将在测试中有2条记录,当TestId&gt; 0然后我将在测试中只有1条记录。

现在我正在尝试找到那些没有SubTests(SubTest.Count=0)进行测试的区域ID,但是当我进行2次测试时,我想考虑最后一次测试并计算最后一次测试的子测试。

我的代码工作正常,但我有一些代码重复,我想简化。

而不是循环我更喜欢Linq,但由于我不知道如何使用linq执行此操作,因此我使用了for循环。

更新

输入:

[0] : Region = "abc"
      RegionId = 1
      "TestList": 
       [
         {
           TestId : 100,
           SubTests  : //contains some records
         },
         {
           TestId : 101,
           SubTests  : //contains some records
         },
       ],
[1] : Region = "Pqr",
      RegionId = 2
      "TestList": 
       [
         {
           TestId : 100,
           SubTests  : //contains some records
         },
         {
           TestId : 101,
           SubTests  : //No records i.e count = 0
         },
       ],
[2] : Region = "Lmn",
      RegionId = 3
      "TestList": 
       [
         {
           TestId : 100,
           SubTests  : //No records i.e count = 0
         },
         {
           TestId : 101,
           SubTests  : //No records i.e count = 0
         }
       ]

预期输出:

[2,3]

如何简化此过程?

2 个答案:

答案 0 :(得分:1)

Linq的requiredSelect方法具有覆盖,其中lambda表达式包括对象及其索引

https://msdn.microsoft.com/es-es/library/bb549418(v=vs.110).aspx

Where

这是一个小提琴 https://dotnetfiddle.net/GZippb

答案 1 :(得分:1)

List<MyData> list; 
...
int[] ids = list.Where(x => x.Tests.Last().SubTests.Count == 0)
                .Select(x => x.RegionId)
                .ToArray();
Where方法中的

表达式可以解释为“测试集合中的最后一次测试没有子测试”。

在我们从列表中找到所有必需的测试后,我们使用Select方法得到RegionId并保存在数组中。