合并两个对象,并使用Linq(C#)在IEnumerable <myobject>中删除myObject的重复属性

时间:2018-08-23 10:07:36

标签: c# linq ienumerable

我正在使用IEnumerable中的myObjects。那些myObjectsApp.config和其他XML文件设置。

我在每个文件的对象模型中加载配置,然后将内容添加到myObjects中。所以我只想合并对象模型。

myObjects包含IEnumerable中的myObjectChild,而myObjectChild包含IEnumerable中的myObjectChildChild

我在所有这些IEnumerable中迷失了一点,也不知道如何合并。

以下是课程:

public class MyObject
{
    public string Name { get; set; }
    public IEnumerable<MyObjectChild> MyObjectChilds { get; set; }
}

public class MyObjectChild
{
    public string Name { get; set; }
    public IEnumerable<MyObjectChildChild> MyObjectChildChilds { get; set; }
}

public class MyObjectChildChild
{
    public string Name { get; set; }
    public string Value { get; set; }
}

///////////////////////////////////////////////// //////////////////////////////

编辑////

class Program
{
    static void Main(IEnumerable<MyObject> myObjects)
    {
        List<MyObject> objectConfigList = new List<MyObject>();
        foreach (var myO in myObjects)
        {
            if (objectConfigList.Any(a => a.Name == myO.Name))
            {
                Console.WriteLine("myO already in the list: " + myO.Name);
                Console.WriteLine("Check current myO.myOC");
                List<MyObjectChild> myOChild = myO.MyObjectChilds.ToList();
                foreach (var myOC in myOChild)
                {
                    if (objectConfigList.Where(a => a.Name == myO.Name).First().MyObjectChilds.Any(s => s.Name == myOC.Name))
                    {
                        Console.WriteLine("myOC already in the myO: " + myOC.Name);
                        List<MyObjectChildChild> tempmyOCC = myOC.MyObjectChildChilds.ToList();
                        Console.WriteLine("Check current myOC.myOCC");
                        foreach (var myOCC in tempmyOCC)
                        {
                            if (objectConfigList.Where(a => a.Name == myO.Name).First().MyObjectChilds.Where(myOCt => myOCt.Name == myOC.Name).First().MyObjectChildChilds.Any(p => p.Name == myOCC.Name))
                            {
                                Console.WriteLine("myOCC already defined in this myOCction: " + myOCC.Name);
                            }
                            else
                            {
                                objectConfigList.Where(a => a.Name == myO.Name).First().MyObjectChilds.Where(myOCc => myOCc.Name == myOC.Name).First().MyObjectChildChilds.ToList().Add(myOCC);
                            }
                        }
                    }
                    else
                    {
                        objectConfigList.Where(a => a.Name == myO.Name).First().MyObjectChilds.ToList().Add(myOC);
                    }
                }
            }
            else
            {
                objectConfigList.Add(myO);
            }
        }
    }
}

我找到了解决方案,因为我没有成功完成提议。

我在这里发布我的解决方案,如果您有任何改进的建议,我将很高兴阅读!

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

要合并来自不同可枚举的许多相同类型的可枚举,请使用.SelectMany()

答案 1 :(得分:0)

要合并两个列表,可以使用IEnumerable.Concat方法,但这不能确保检查重复

您可以使用IEnumerable.Distinct()删除重复项,但是MyObject必须实现IEquatable接口

public class MyObject : IEquatable<MyObject>
{
    public string Name { get; set; }
    public IEnumerable<MyObjectChild> MyObjectChilds { get; set; }
    public bool Equals<MyObject>(MyObject other) { return this.Name.Equals(other.Name);    }
}