Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Delphi İle Linq Benzeri Kullanımı Hk.
#1
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

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
Cevapla
#2
Çok faydalı bir çalışma olmuş, emeğin için teşekkürler
Cevapla
#3
(24-11-2020, Saat: 11:42)sebahattin.koc Adlı Kullanıcıdan Alıntı: Çok faydalı bir çalışma olmuş, emeğin için teşekkürler

Teşekkürler.

Kodu Güncelledim 

Tolist,any,Find,Where aktif olarak kullanılabiliyor hayırlı çalışmalar zaman buldukçada geliştireceğim sanırım bunu Smile
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi + Python, Makro yapımı yardım eroniko 0 41 2 saat önce
Son Yorum: eroniko
  VB 2013-den Delphi kecid deutsch1988 8 498 14-05-2024, Saat: 17:21
Son Yorum: deutsch1988
  Delphi virus gibi deutsch1988 14 849 11-05-2024, Saat: 10:21
Son Yorum: engerex
  timer kullanimi hakkinda sadikacar60 11 506 28-04-2024, Saat: 19:33
Son Yorum: sadikacar60
  delphi 10.4 deutsch1988 0 120 18-04-2024, Saat: 11:46
Son Yorum: deutsch1988



Konuyu Okuyanlar: 1 Ziyaretçi