【问题标题】:Merge two objects and remove dupplicated properties for myObject in IEnumerable<myObject> with Linq (C#)使用 Linq (C#) 合并两个对象并删除 IEnumerable<myObject> 中 myObject 的重复属性
【发布时间】:2019-01-29 16:28:55
【问题描述】:

我与IEnumerablemyObjects 一起工作。那些myObjectsApp.config 和其他XML 文件设置。

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

myObjects 包含 IEnumerablemyObjectChildmyObjectChild 包含 IEnumerablemyObjectChildChild

我有点迷失在所有这些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);
            }
        }
    }
}

我找到了一个解决方案,因为我没有成功。

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

感谢您的帮助。

【问题讨论】:

  • 你能显示一些代码吗?
  • 使用 Distinct()。
  • 从问题的描述我们只能猜测你的问题是什么。继续阅读How to Ask 并发布minimal reproducible example 以获得任何帮助。
  • 对不起,这是我的第一篇文章,我有点迷茫。我已经添加了类,我使用 IEnumerable 并希望合并所有 MyObject 而不会丢失任何 MyObjectChildChild
  • 你正在尝试加入这两个集合,stackoverflow.com/questions/14164974/… ?如果一个项目可以出现在两个列表中,但不应该出现在结果输出中,那么你将不得不使用 IEquatable 然后你可以将它们合并在一起。

标签: c# linq ienumerable


【解决方案1】:

要合并两个列表,您可以使用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);    }
}

【讨论】:

  • 感谢您的回答,我会尽力做到的:)。
【解决方案2】:

要从不同的 ienumerables 中合并许多相同类型的 ienumerables,你有.SelectMany()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-23
    • 2019-06-01
    • 1970-01-01
    • 2010-09-19
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多