【问题标题】:Remove Duplicates in Arraylist C# 2.0删除 Arraylist C# 2.0 中的重复项
【发布时间】:2013-09-23 16:22:05
【问题描述】:

我正在寻找的是从 idFAV 中删除重复项,然后将其放入文本字​​段中。有任何想法吗?我正在研究 C# 2.0。

// main.cs

    public void Page_Load(object sender, EventArgs e)
    {
        Session["FAVisible"] = new ArrayList();
    }

// share.cs

    public void Page_Load(object sender, EventArgs e)
             {
               ArrayList idFAV = (ArrayList)Session["FAVisible"];
               idFAV.Add(FileName));
               Session["FAVisible"] = idFAV;

               for(int i=0; i < DisplayCount; i++) 
               {
                     FileAttachedVisible.Text = idFAV[i].ToString();
               }

              }

【问题讨论】:

  • 您为什么使用ArrayList 而不是List&lt;T&gt;? .Net 2.0 和 C# 2.0 中提供了通用集合。
  • 列表中有哪些类型的对象?

标签: c# c#-2.0


【解决方案1】:

如果这是您使用 ArrayList 的所有地方,那么最简单的解决方法是在添加之前检查 idFAV 是否​​包含 FileName,并且您将永远不会有重复。或者,如果此数组列表在某处被修改,那么您可以创建一个新的 Arraylist 并循环遍历 idFAV 中的所有项目,并且仅当它不存在于新列表中时才添加。

【讨论】:

  • 如何将其从 idFAV 中删除?我一直在网上到处找,找不到任何例子。
  • 您不必删除它。您可以使用 newList.Contains(obj) 方法检查条目是否已存在
【解决方案2】:

如果在添加之前检查它,则不需要删除... 例如:

           foreach (var iMeter in meter)
              {
                   if (!ip.Contains(iMeter.IP))
                    {
                          ip.Add(iMeter.IP);
                      }
              }

【讨论】:

    【解决方案3】:

    您可以尝试构建新的 ArrayList 并检查要添加的任何新元素是否已在该列表中。

    ArrayList result = new ArrayList();
    
    foreach(var elem in idFav)
    {
       if (!result.Contains(elem))
       {
           result.Add(elem);
       }
    }
    

    当然,这个解决方案的性能并不是最好的(O(n^2))。最好尝试使用 Hashsets/dicitonaries 并在 O(n) 中执行此操作。

    此外,要使 ArrayList 中的对象工作,需要实现 Equals。如果 FileName 是字符串,则无需担心。

    【讨论】:

    • 变种? CS0246:找不到类型或命名空间名称“var”(您是否缺少 using 指令或程序集引用?)
    【解决方案4】:

    这是完成任务的一种方法。我确信它可以简化,但我想列出流程中的每个步骤。

    // Build ArrayList
    ArrayList al = new ArrayList();
    al.Add(1);
    al.Add(1);
    al.Add(2);
    al.Add(2);
    al.Add(3);
    al.Add(4);
    al.Add(4);
    al.Add(4);
    
    // Create List from ArrayList
    List<object> oList = new List<object>(al.ToArray());
    
    // Declare holder to distinct values
    List<object> distinctValues = new List<object>();
    
    // Get distinct values
    oList.ForEach(delegate(object o) {
        if (!distinctValues.Contains(o)) {
            distinctValues.Add(o);
        }
    });
    
    // Copy original list as a list with duplicates
    List<object> duplicateValues = new List<object>(oList);
    
    // Remove the first instance of each distinct value
    // leaving all duplicates
    distinctValues.ForEach(delegate(object o){
        duplicateValues.Remove(o);
    });
    
    // Display distinct values
    foreach (object o in distinctValues) {
        MessageBox.Show(o.ToString(), "Distinct");
    }
    
    // Display duplicate values
    foreach (object o in duplicateValues) { 
        MessageBox.Show(o.ToString(), "Duplicate");
    }
    

    【讨论】:

      【解决方案5】:
      using System; using System.Collections;
      using System.Collections.Generic;
      using System.Linq;
      
      class Program 
      { 
      static void Main() List list = new List();
      Console.WriteLine("number: "); int num = int.Parse(Console.ReadLine());
      while (num > 0) { list.Add(num % 10); num /= 10; } list.Reverse();
      List distinct = list.Distinct().ToList();
      PrintValues(distinct);
      static void PrintValues(IEnumerable distinct) 
      {
       foreach (object value in distinct) Console.Write("{0}", value); 
        Console.WriteLine();
      } 
      }
      }
      

      【讨论】:

      • 最好能对解决方案进行某种文字说明,而不仅仅是粘贴代码。
      猜你喜欢
      • 2018-05-29
      • 2015-12-12
      • 1970-01-01
      • 2011-01-26
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多