Merhaba,
Delphi'de linq nun olmaması büyük bir eksik ama yine de çözüm yolu yok değil.
Hocam Dediğim Değerli @ismailkocacan arkadaşımın yönlendirmeleri ile küçük bir Nesne yazmayı başardım, Kendisine Ne kadar teşekkür etsem de azdır.
Yazdığım kodu sizlerle paylaşmak istiyorum
LinqTList.pas
Kullanımı
Umarım Faydalı olur
Delphi'de linq nun olmaması büyük bir eksik ama yine de çözüm yolu yok değil.
Hocam Dediğim Değerli @ismailkocacan arkadaşımın yönlendirmeleri ile küçük bir Nesne yazmayı başardım, Kendisine Ne kadar teşekkür etsem de azdır.
Yazdığım kodu sizlerle paylaşmak istiyorum
LinqTList.pas
unit unit5; interface uses System.Generics.Collections,System.SysUtils,Generics.Defaults; type TListL<T:class> = Class(TObjectList<T>) private FOwnsObjects:boolean; Constructor Destroy ; private property OwnsObjects: Boolean read FOwnsObjects; public function find(aFound:TPredicate<T>) :T; function Any(aFound:TPredicate<T>) :Boolean; private type TEnumarableL<t:class> = Class(TEnumerable<T>) [unsafe] FListObj: TObject; public function ToListL:TListL<T>; protected function DoGetEnumerator: TEnumerator<T>; override; End; public function Where(aFound:TPredicate<T>) :TEnumarableL<T>; End; implementation function TListL<T>.TEnumarableL<T>.ToListL:TListL<T>; var buf: TListl<T>; x: TEnumarableL<T> ; begin result := TListl<T>(self).Create; end; function TListL<T>.TEnumarableL<T>.DoGetEnumerator: TEnumerator<T>; var A:TEnumerator<T>; begin a := Self.GetEnumerator.Create ; result:=a; end; // Constructor TListL<T>.Destroy; begin end; function TListL<T>.Where(aFound:TPredicate<T>) :TEnumarableL<T>; var R:TListL<T>; Item:T; begin R :=TListL<T>.Create; for Item in self do if aFound(Item) then R.Add(Item); result := TEnumarableL<T>®.create; end; function TListL<T>.Any(aFound:TPredicate<T>):Boolean; var Item:T; begin for Item in self do if aFound(Item) then exit(true); result := false; end; function TListL<T>.find(aFound:TPredicate<T>):T; var Item:T; begin for Item in self do if aFound(Item) then exit(item); result := nil; end; end.
Kullanımı
unit Unit4; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,unit5; Type TT = class a:string; Constructor Create(_S:string); end; type TForm4 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form4: TForm4; implementation {$R *.dfm} Constructor TT.Create(_S:string); begin Self.a := _S; end; procedure TForm4.Button1Click(Sender: TObject); var I:TlistL<TT>; k: TT; w:TListL<TT>; d:boolean; f: TT; l: TT; begin I := TlistL<TT>.Create; I.Add(TT.Create('1')); I.Add(TT.Create('2')); I.Add(TT.Create('2')); I.Add(TT.Create('2')); I.Add(TT.Create('3')); I.Add(TT.Create('100')); I.Add(TT.Create('1000')); //TT Türünde Döner k:= I.find(function(u : TT):Boolean begin Result := (u.a = '2'); end ); //TEnumarableL<TT> Türünde Döner w:=I.Where(function(u : TT):Boolean begin Result := (u.a = '1000') or (u.a = '100') or (u.a = '2'); end ).ToListL();//TListL<TT> türüne atanır //TT Türünde ListL Collection'un varsa ilk elemanını dönderir f := w.First; //TT Türünde Son Elemanı Dönderir l := w.Last; //false:true olarak döner d:= w.Any(function(u:TT):Boolean begin Result := (u.a = '1000'); end ); Showmessage(k.a + ' find sorguya göre bulunmuş ilk eleman'); Showmessage(w.Count.ToString + ' Where Koşulu İle bulunmuş Elemanların Sayısı'); Showmessage(f.a + ' İlk Eleman'); Showmessage(l.a + ' Son Eleman'); if d then Showmessage('Listemizin İçinde Şartımızı Sağlayan Eleman Bulunuyor'); end; end.
Umarım Faydalı olur