如何检查数组是否包含特定值?

时间:2015-04-17 11:04:25

标签: delphi

我该怎么写这个?:

If number is different from Array[1] to Array[x-1] the begin...... 

其中number是一个整数,array是一个从1到x的整数数组

2 个答案:

答案 0 :(得分:10)

如果在数组number中找不到MyArray,我相信你想做点什么。然后你就可以这样做:

NoMatch := true;
for i := Low(MyArray) to High(MyArray) do
  if MyArray[i] = number then
  begin
    NoMatch := false;
    break;
   end;

if NoMatch then
  DoYourThing;

您可以创建一个函数来检查数组中是否找到了数字。然后,每次需要执行此类检查时,您都可以使用此功能。每次,代码都会更具可读性。例如,您可以这样做:

function IsNumberInArray(const ANumber: integer; 
  const AArray: array of integer): boolean;
var
  i: integer;
begin
  for i := Low(AArray) to High(AArray) do
    if ANumber = AArray[i] then
      Exit(true);
  result := false;
end;

...

if not IsNumberInArray(number, MyArray) then
  DoYourThing;

如果您使用旧版本的Delphi,则必须将Exit(true)替换为begin result := true; break; end。在较新版本的Delphi中,我想你也可以玩泛型等东西。

答案 1 :(得分:1)

您也可以编写泛型版本,但是不能将泛型与独立过程一起使用,它们需要绑定到类或记录上。类似于以下内容

unit Generics.ArrayUtils;

interface

uses
  System.Generics.Defaults;

type
  TArrayUtils<T> = class
  public
    class function Contains(const x : T; const anArray : array of T) : boolean;
  end;

implementation

{ TArrayUtils<T> }

class function TArrayUtils<T>.Contains(const x: T; const anArray: array of T): boolean;
var
  y : T;
  lComparer: IEqualityComparer<T>;
begin
  lComparer := TEqualityComparer<T>.Default;
  for y in anArray do
  begin
    if lComparer.Equals(x, y) then
      Exit(True);
  end;
  Exit(False);
end;

end.

用法是

procedure TForm6.Button1Click(Sender: TObject);
begin
  if TArrayUtils<integer>.Contains(3, [1,2,3]) then
    ShowMessage('Yes')
  else
    ShowMessage('No');
end;

应该使用诸如TArray<integer>array of integer之类的参数以及常量数组(如图所示)-并且您可以向该类添加许多其他方法,例如IndexOf或{{ 1}} ...