【问题标题】:Find highest integer in a Generic List using C#?使用 C# 在通用列表中查找最大整数?
【发布时间】:2009-06-23 18:24:22
【问题描述】:

我有以下List<int> 集合,我需要找到集合中的最高整数。它可以有任意数量的整数,我可以多次使用相同的整数值。

List<int> MyList = new List<int> { 3, 4, 6, 7, 9, 3, 4, 5, 5 };

找出最大整数的最简单算法是什么?我正在使用 C# 和 .NET 3.5 框架。

【问题讨论】:

  • 无限?这是很多整数。
  • 我认为这是一个技巧问题。
  • @Groo - 这不是一个技巧问题。
  • A List 从来没有无限数量的整数 - Count 属性为您提供了它的大小。您的意思是任意数字吗?
  • 您能否详细解释一下,“最佳算法”是什么意思?

标签: c# .net-3.5


【解决方案1】:

你可以这样做:

int max = MyList.Max();

详情请见Enumerable.Max

【讨论】:

  • 确保使用 System.Linq 添加;因为 Max 是一种扩展方法。
【解决方案2】:

如果您需要经常检索最大值,您可能会考虑创建自己的列表类(或从 List 派生),它将最大项保存在缓存中。这样的类可能如下所示:

public class MaxList<T> : IList<T>, ICollection<T>, IEnumerable<T>
{
    T Maximum { get; set; }
    List<T> _list;

    public T this[int index] { get; set; }

    public void Add(T item)
    {
        if (item > this.Maximum)
        {
            this.Maximum = item;
        }
        _list.Add(item);
    }

    // ... IEnumerable<T>, ICollection<T> and IList<T> members 

}

或者,您可以直接从 List 派生并覆盖 Add 和 Remove 方法(基本上所有修改列表项的方法)并相应地更新缓存。

这种方法是否真的有好处取决于您的情况。如果您有一个非常大的列表并且很少更新并且您需要经常检索最大值,那么它肯定是。否则,请使用已经建议的解决方案,因为它们要简单得多。

【讨论】:

  • 您需要有一个状态来指示最大值当前是否有效。如果删除的项目等于最大值,则它应该是无效的。在这种情况下,get 方法将需要重新扫描列表(可能使用 Max 扩展方法)以获得新的最大值。您也可以只使用排序列表,但还有其他相关价格。
  • 是的,你是对的。我很懒,只提供了一个 sceleton 类,我在其中省略了需要使缓存失效的删除方法和索引器。我还省略了重新计算缓存的方法,它可以使用 Enumberable.Max。
【解决方案3】:

Enumerable 有一个 Max 函数可以做到这一点。

查看使用 Reflector 的整数特定 method 的实现,该方法循环遍历 IEnumerable 源中的每个元素,并将其与之前的最大值进行比较。

【讨论】:

    【解决方案4】:

    genericlist.Remove(genericlist.Max)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 2017-06-05
      • 1970-01-01
      • 2016-05-25
      相关资源
      最近更新 更多