如何在通用TList <Integer>中获取最大值?

Jen*_*off 4 delphi delphi-xe2

获得最大值的最简单方法是TList<Integer>什么?

function GetMaximum(AList: TList<Integer>): Integer;
begin
  Assert(AList.Count > 0);
  Result := ?;
end;
Run Code Online (Sandbox Code Playgroud)

我读到C#有一个AList.Max,在Delphi中有类似的东西吗?

Dav*_*nan 10

这是一个MaxValue在通用容器上实现的有趣示例:

{$APPTYPE CONSOLE}

uses
  System.SysUtils, System.Generics.Defaults, System.Generics.Collections;

type
  TMyList<T> = class(TList<T>)
  public
    function MaxValue: T;
  end;

{ TMyList<T> }

function TMyList<T>.MaxValue: T;
var
  i: Integer;
  Comparer: IComparer<T>;
begin
  if Count=0 then
    raise Exception.Create('Cannot call TMyList<T>.MaxValue on an empty list');
  Comparer := TComparer<T>.Default;
  Result := Self[0];
  for i := 1 to Count-1 do
    if Comparer.Compare(Self[i], Result)>0 then
      Result := Self[i];
end;

var
  IntList: TMyList<Integer>;
  DoubleList: TMyList<Double>;
  StringList: TMyList<string>;

begin
  IntList := TMyList<Integer>.Create;
  IntList.AddRange([10, 5, 12, -49]);
  Writeln(IntList.MaxValue);

  DoubleList := TMyList<Double>.Create;
  DoubleList.AddRange([10.0, 5.0, 12.0, -49.0]);
  Writeln(DoubleList.MaxValue);

  StringList := TMyList<string>.Create;
  StringList.AddRange(['David Heffernan', 'Uwe Raabe', 'Warren P', 'Jens Mühlenhoff']);
  Writeln(StringList.MaxValue);

  Readln;
end.
Run Code Online (Sandbox Code Playgroud)

因为我们无法提出一个通用的等价物,low(Integer)因为我在空列表上调用该方法时引发异常.

输出是:

12
 1.20000000000000E+0001
Warren P


Nic*_*ges 8

以下是另一个答案:使用Spring.Collections.pasSpring4D框架中的单元:(在此处找到:http: //code.google.com/p/delphi-spring-framework/)

program ListEnumerableDemo;

{$APPTYPE CONSOLE}

uses 
    System.SysUtils 
  , Spring.Collections;

var 
  List: IList<Integer>; 
  Enumerable: IEnumerable<Integer>;

begin 
  try 
    List := TCollections.CreateList<Integer>; 
    List.AddRange([1,6,2,9,54,3,2,7,9,1]);

    Enumerable := List; 
    WriteLn(Enumerable.Max); 
    ReadLn; 
  except 
    on E: Exception do 
      Writeln(E.ClassName, ': ', E.Message); 
  end; 
end. 
Run Code Online (Sandbox Code Playgroud)

  • +1,使用`ENumerable <T>`,因为它根本不是'TList <T>`问题. (2认同)
  • 由于IList <T>继承自IEnumerable <T>,我们可以使用List.Max而不将其强制转换为IEnumerable <T> :) (2认同)