我试图在两个具有不同对象的列表中进行迭代。当我比较 listTest1
和 listTest2
时,如果它们满足以下条件,我会将记录添加到第三个列表
- 如果
abbrv
和date
相同,我将对象从listTest2
添加到listTest3
- 如果
abbrv
相同但date
不同,我将对象从listTest2
添加到listTest3
并且我将完成的属性切换为true
。此外,我将listTest1
中的记录添加到listTest3
。 - 如果
listTest1
中的abbrv
在listTest2
中不存在,我将把listTest1
中的记录添加到listTest3
.
我知道这听起来很困惑,这就是为什么我会向您展示我得到的和我期望的。
我得到:
我需要获取所有这些记录,但重复项(Test2)除外。
static void Main(string[] args)
{
Test1 test1 = new Test1() { abbrv = "Test1", date = new DateTime(2017, 11, 12), completed = false };
Test1 test2 = new Test1() { abbrv = "Test2", date = new DateTime(2017, 12, 17), completed = false };
Test1 test5 = new Test1() { abbrv = "Test5", date = new DateTime(2017, 12, 12), completed = false };
Test2 test3 = new Test2() { abbrv = "Test1", date = new DateTime(2017, 11, 12), completed = false, abbrevName = "AbbrvName1" };
Test2 test4 = new Test2() { abbrv = "Test2", date = new DateTime(2017, 12, 12), completed = false, abbrevName = "AbbrvName2" };
List<Test1> listTest1 = new List<Test1>();
List<Test2> listTest2 = new List<Test2>();
List<Test2> listTest3 = new List<Test2>();
listTest1.Add(test1);
listTest1.Add(test2);
listTest1.Add(test5);
listTest2.Add(test3);
listTest2.Add(test4);
for (int i = 0; i < listTest1.Count; i++)
{
for (int a = 0; a < listTest2.Count; a++)
{
if (listTest1[i].abbrv == listTest2[a].abbrv && listTest1[i].date == listTest2[a].date)
{
if (!listTest3.Any(x => x.abbrv == listTest1[i].abbrv))
{
listTest3.Add(listTest2[a]);
}
}
else
{
if (listTest1[i].abbrv == listTest2[a].abbrv)
{
if (!listTest3.Any(x => x.abbrv == listTest1[i].abbrv && x.date != listTest1[i].date))
{
listTest3.Add(new Test.Test2() { abbrv = listTest2[a].abbrv, date = listTest2[a].date, completed = true, abbrevName = listTest2[a].abbrevName });
listTest3.Add(new Test.Test2() { abbrv = listTest1[i].abbrv, date = listTest1[i].date, completed = listTest1[i].completed, abbrevName = string.Empty });
}
}
else if (listTest1[i].abbrv != listTest2[a].abbrv)
{
if(!listTest3.Any(x => x.abbrv == listTest1[i].abbrv))
{
listTest3.Add(new Test.Test2() { abbrv = listTest1[i].abbrv, date = listTest1[i].date, completed = listTest1[i].completed, abbrevName = string.Empty });
}
}
}
}
}
}
public class Test1
{
public string abbrv { get; set; }
public DateTime date { get; set; }
public bool completed { get; set; }
}
public class Test2
{
public string abbrv { get; set; }
public DateTime date { get; set; }
public bool completed { get; set; }
public string abbrevName { get; set; }
}
最佳答案
你正确地实现了前两个条件,但是第三个条件无法在最内层循环中实现:你无法判断 listTest1
中的 abbrv
是否存在于 listTest2 中
直到你的内循环结束。
添加一个 bool
变量 abbrvFound
表示找到了一个 abbrv
。在进入嵌套循环前设置为false
;如果找到匹配项,则将其设置为 true
。
循环结束后,检查abbrvFound
,决定是否需要添加listTest1
对象。
for (int i = 0; i < listTest1.Count; i++) {
bool abbrvFound = false;
for (int a = 0; a < listTest2.Count; a++) {
if (listTest1[i].abbrv != listTest2[a].abbrv)
continue;
abbrvFound = true;
if (listTest1[i].date == listTest2[a].date) {
listTest3.Add(listTest2[a]);
} else {
listTest3.Add(new Test.Test2() { abbrv = listTest2[a].abbrv, date = listTest2[a].date, completed = true, abbrevName = listTest2[a].abbrevName });
listTest3.Add(new Test.Test2() { abbrv = listTest1[i].abbrv, date = listTest1[i].date, completed = listTest1[i].completed, abbrevName = string.Empty });
}
}
if (!abbrvFound) {
listTest3.Add(new Test.Test2() { abbrv = listTest1[i].abbrv, date = listTest1[i].date, completed = listTest1[i].completed, abbrevName = string.Empty });
}
}
关于c# - 在具有不同对象的两个列表中迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47111017/