【问题标题】:C# How do I replace objects in one collection with Objects from another collectionC#如何用另一个集合中的对象替换一个集合中的对象
【发布时间】:2012-01-08 12:30:14
【问题描述】:

如何将 Collection1 中的对象替换为 Collection2 中的匹配对象(按名称和描述)?

Collection2 中匹配操作的对象也必须在一定范围内,比如从 0 到 20。 Collection2 中 index > 20 的对象需要追加到 Collection1 中。

【问题讨论】:

  • 使用 linq-to-object 并使用 .Contains 运算符
  • 我写了一段复杂的代码来做到这一点。我想肯定会有一些更简单和优雅的方式来做这件事,使用 linq 或其他方式。

标签: c# .net linq collections observablecollection


【解决方案1】:
List<MyClass> originalCollection = new List<MyClass>();
List<MyClass> newStuff = new List<MyClass>();

foreach (var item in newStuff)
{
    int index = originalCollection.FindIndex(x => x.Name == item.Name && x.Description == item.Description);

    if (index < 0)
        continue;

    originalCollection[index] = item;
}

如果你真的想要一个 1-liner...

List<MyClass> originalCollection = new List<MyClass>();
List<MyClass> newStuff = new List<MyClass>();

originalCollection = newStuff.Concat(originalCollection.Where(x => !newStuff.Any(y => y.Description == x.Description && y.Name == x.Name)).ToArray()).ToList();

【讨论】:

    【解决方案2】:

    这是一种方式:

    foreach (var item in collection2.Take(20)) // grab replacement range
    {
        int index;
        if ((index = collection1.FindIndex(x => 
                                      x.Name == item.Name && 
                                      x.Description == item.Description)) > -1)
        {
            collection1[index] = item;
        }
    }
    collection1.AddRange(collection2.Skip(20)); // append the rest
    

    如果您的意图更明确一点,代码很可能会得到更多改进。如果能更好地理解问题,可能会有更简洁的方法。

    【讨论】:

    • 我以一种笼统的方式提出了我的问题,以便大多数人都能从阅读中受益。无论如何,我选择你的作为答案,因为它是最完整的,但其他人也给出了很好的解决方案,如果我自己有足够的代表点,我会代表他们。大家干杯。
    【解决方案3】:
        List<MyClass> mainList = new List<MyClass>();
        List<MyClass> childList = new List<MyClass>();
    
        foreach (MyClass myClass in childList)
        {
            int index = mainList.FindIndex(delegate(MyClass item) { return    (item.Name==myClass.Name && ; item.Description == myClass.Description);});
            mainList[index] = myClass;
        }
    

    试试这个。我希望你能得到你想要的结果。

    【讨论】:

      【解决方案4】:

      扩展方法中的一种方式

      public static void Replace(this object[] elements, object oldObject, object newObject) {
      var index = elements.IndexOf(oldObject);
      
      if (index > 0) {
       elements[index] = newObject;
      }}
      

      【讨论】:

      • 您的意思是索引大于或等于零?
      猜你喜欢
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多