以下是我的模特:
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]
如何简化此过程?
答案 0 :(得分:1)
Linq的required
和Select
方法具有覆盖,其中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
并保存在数组中。