Merhaba,
Elimde 70 adet string bilgi var. Karşılaştırma yapıp dönen sonuca göre değer atamam gerekiyor. Fakat bunu if döngüsü ile yaptığımda kod uzayıp gidiyor.
Case of yapısıda bildiğim kadarıyla stringlerde kullanılamıyor. Peki böyle çoklu if karşılaştırmalarında kullanılan başka bir yöntem var mı ? Bunu merak edip öğrenmek istedim. Paylaşımlarınız için şimdiden teşekkürler. Örnek olarak aşağıdaki şekilde bir karşılaştırma için 70 adet if kullandım . İşin kötü tarafı bir okadar daha Else için kullanacak olmam )) yani gecici='otcm16-1' eşit değilse gecici de ki değeri aldığın gibi yaz demem gerekiyor.
if gecici='otcm16-1' then begin tahminturu:='İyms'; tahmini:='0-0'; end;
if gecici='otcm13-1' then begin tahminturu:='İyms'; tahmini:='0-1'; end;
if gecici='otcm19-1' then begin tahminturu:='İyms'; tahmini:='0-2'; end;
if gecici='otcm15-1' then begin tahminturu:='İyms'; tahmini:='1-0'; end;
if gecici='otcm12-1' then begin tahminturu:='İyms'; tahmini:='1-1'; end;
if gecici='otcm18-1' then begin tahminturu:='İyms'; tahmini:='1-2'; end;
if gecici='otcm17-1' then begin tahminturu:='İyms'; tahmini:='2-0'; end;
if gecici='otcm14-1' then begin tahminturu:='İyms'; tahmini:='2-1'; end;
if gecici='otcm20-1' then begin tahminturu:='İyms'; tahmini:='2-2'; end;
Problemi biliyorsan çözümü basittir derler.
Parse işlemlerinde ben de benzer durumlarla karşılaşıyorum ve basit bir çözümüm var. TStringList kullanıyorum. INDEX'i bana IF halini veriyor.
Tüm alternatifleri bir TStringList'e koyup CASE 'e dönüştürebilirsin. Senin örneğin ile aşağıdaki şekilde ifade edebilirim.
Muhharem hocamın yöntemi bence makul olan ama alternatif olarak şöyle bir şey deneyebilirsin. Elinde bir veri kümesi olduğunu varsayarak bunları bir class haline getirerek bir Liste içine alabilirsin. Örneğin:
TMyList = class(Tlist)
private
FSelected : TMyItem;
FOnAdd: TNotifyEvent;
protected
function GetItem(Index: Integer): TMyItem;
procedure SetItem(Index: Integer; AObject: TMyItem);
procedure DoAdd(Sender:TObject);
public
constructor Create;
destructor Destroy;
function Add(AObject: TMyItem): Integer;
function Remove(AObject: TMyItem): Integer;
function IndexOf(AObject: TMyItem): Integer;overload;
function IndexOf(Name:string): Integer;overload;
procedure Insert(Index: Integer; AObject: TMyItem);
property Items[Index: Integer]: TMyItem read GetItem write SetItem; default;
function Select(index:Integer):TMyItem;
function IsEmpty:Boolean;
function FindByTahmini(Name:string):TMyItem;
published
property OnAdd : TNotifyEvent read FOnAdd write FOnAdd;
property Selected :TMyItem read FSelected;
end;
Bütün operasyonlarını kontrol edebilirsin. Tabi yapacağın işlem çok basit birşey ise uğramaya değmez bu yöntem. Sadece fikir vermesi açısından değerlendirebilirsin.
function CaseOfString(s: string; a: array of string): Integer;
begin
Result := 0;
while (Result < Length(a)) and (a[Result] <> s) do
Inc(Result);
if a[Result] <> s then
Result := -1;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
case CaseOfString(Edit1.Text, ['Badkursat', 'Mrmarman', 'Lord-ares', 'Ikra']) of
0: Label1.Caption := 'Badkursat';
1: Label1.Caption := 'Mrmarman';
2: Label1.Caption := 'Lord-ares!';
3: Label1.Caption := 'Ikra';
else
Label1.Caption := 'isim bulunamadi';
end;
end;
Merhaba,
Stringler için case of kullanabilirsiniz. Önemli olan yöntemini bulmak. Örneğin stringe sayısal karşılık gelen bir algoritma işinizi görecektir.
In dubio pro reo... Şüpheden sanık/özgürlük yararlanır...