c# - 在具有不同对象的两个列表中迭代

标签 c#

我试图在两个具有不同对象的列表中进行迭代。当我比较 listTest1listTest2 时,如果它们满足以下条件,我会将记录添加到第三个列表

  • 如果 abbrvdate 相同,我将对象从 listTest2 添加到 listTest3
  • 如果 abbrv 相同但 date 不同,我将对象从 listTest2 添加到 listTest3 并且我将完成的属性切换为 true。此外,我将 listTest1 中的记录添加到 listTest3
  • 如果 listTest1 中的 abbrvlistTest2 中不存在,我将把 listTest1 中的记录添加到listTest3.

我知道这听起来很困惑,这就是为什么我会向您展示我得到的和我期望的。

我得到:

My image

我需要获取所有这些记录,但重复项(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/

相关文章:

c# - 从 C# 在同一环境中执行多个命令

c# - Web 服务的 XML 结果

c# - CustomForm 中的 ClientPeoplePicker

c# - 合并两组相同的实体

c# - 通过 tcpclient 发送序列化对象的问题

c# - C#速记法这有什么问题?

c# - 如何声明 C# Web 用户控件但阻止它初始化?

c# - 为什么我无法在 WebView (UWP) 中打开外部浏览器中的链接?

c# - 属性有 volatile 影响吗?

C# 等效于 Xaml 的 CommandParameter ="{Binding .}"