locked
Bir Koleksiyon içinden Id'sini belirlediğim Elemanın Sorgulamasını Yapmak RRS feed

  • Soru

  •  


    List<Customer> customerss = new List<Customer> { new Customer{FirstName = "Elvent", Id = 1}, new Customer{FirstName = "Ahmet", Id = 2} }; #region Koleksiyon metotları var count = customerss.Count();//customer'in eleman sayısı. var customer2 = new Customer { Id = 3, FirstName = "Salih", }; customerss.Add(customer2);//customerss adlı nesnemize customer2'yi ekledik. //Customerin içinde tanımladığımız "customerss" müşterisine yeni bir ekleme yapmak istersek alttaki AddRangeyi kullanmamız gerekir. customerss.AddRange(new Customer[2]//Burada Bize diyor ki Array bazlı liste ver bende customerss'in içine ekliyeyim. { new Customer{FirstName = "Ali", Id = 4}, //genelde bunu elimizde bir veri tabanı varken, yeni bir liste geldiği zaman altına eklemek için kullanırız. new Customer{FirstName = "Yılmaz", Id = 5} } );

                if (new Customer().Id == 4)
                {
                    Console.WriteLine("Böyle bir ID bulundu");
                }
                else
                {
                    Console.WriteLine("Böyle bir ID bulunamadı.");
                }

    Bu şekilde olmuyor :) Burada zaten new diyerek yeni bir Customer oluşturuyorum

    bu yüzden olmaz'da doğrusu nasıl olmalı ? Nerde hata yapıyorum


    class Customer { public int Id { get; set; } public string FirstName { get; set; } }


    Merhaba, biraz araştırma yaptım ancak bunun gibi bir örnek bulamadım. Aşağıdaki örnek koleksiyonda Mesela Id'si 4 olan kullanıcıyı sorgulayıp, ona göre işlem yapmak istiyorum ve burada cidden takıldım. Bunu nasıl yapabilirim ?

    7 Eylül 2019 Cumartesi 04:23

Yanıtlar

  •  List<Customer> liste = new List<Customer>();
    
                if (liste.Any(x => x.ID == 4)){
                    //id 4 olan var
                }
                else
                {
                    //id 4 yok
                }
                //başka örnek
    
                if (liste.Any(x => x.ID == 4 && x.Name == "mehmet"))
                {
                    //ID 4 ve adı mehmet olan var
                }
                else
                {
                    //yok
                }

    Any dışında exist ve contains methodlarına da bakabilirsin.
    7 Eylül 2019 Cumartesi 06:27
  • Direk Cihan'a yazıyorsun, bizim yazmamızda sorun yoktur sanırım?

    Equals methodu Object tipinden -neredeyse- tüm classlara miras kalır. Bir class tanımladığında otomatik olarak Object'ten miras almış olursun. Bu da Object'in virtual olan ToString, Equals ve GetHashCode methodları sende de olur ve istersen bunları ezip(override), yerine kendi methodlarını koyabilirsin demek.

    Aşağıdaki örnekte "Aynı renkteki elmalar birbirlerine eşittir" hedefini modelliyor.

    enum Renkler{
    	Kırmızı, Golden, Yeşil
    }
    
    class Elma
    {
    	public int Id { get; set; }
    	public Renkler Renk { get; set; }
    	public float Ağırlık { get; set; }
    	
    	public Elma(int Id, Renkler Renk, float Ağırlık)
    	{
    	        this.Id = Id;
    		this.Renk = Renk;
    		this.Ağırlık = Ağırlık;
    	}
    	
    	public override bool Equals(Object Obj)
    	{
    		if(Obj is Elma)
    		return ((Elma)Obj).Renk == this.Renk;
    		else return false;
    	}
        public override int GetHashCode()
        {
             return (int)this.Renk;
        } public static bool operator ==(Elma Elma1, Elma Elma2) => Elma1.Renk == Elma2.Renk; public static bool operator !=(Elma Elma1, Elma Elma2) => Elma1.Renk != Elma2.Renk; }


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com



    10 Eylül 2019 Salı 06:56
    Moderatör

Tüm Yanıtlar

  •  List<Customer> liste = new List<Customer>();
    
                if (liste.Any(x => x.ID == 4)){
                    //id 4 olan var
                }
                else
                {
                    //id 4 yok
                }
                //başka örnek
    
                if (liste.Any(x => x.ID == 4 && x.Name == "mehmet"))
                {
                    //ID 4 ve adı mehmet olan var
                }
                else
                {
                    //yok
                }

    Any dışında exist ve contains methodlarına da bakabilirsin.
    7 Eylül 2019 Cumartesi 06:27
  • Çok teşekkür ederim hocam taamamdır :)

    7 Eylül 2019 Cumartesi 07:24
  •  var count = customerss.Count();//customer'in eleman sayısı.

    Eğer List üzerinde çalışıyorsanız kendisine ait Count özelliğini kullanın. Count() metodu işleri gereksiz karıştırmaktadır. 

    Sorunun kendisinde Id nin tekil olma koşulu varsa List değil HashSet kullanmanız daha uygun olacaktır.

    void Main()
    {
    	var liste = new HashSet<Customer>(new CustomerEqualityComparer());
    	liste.Add(new Customer { Id = 2, Name = "Cihan" });
    	liste.Add(new Customer { Id = 2, Name = "Mehmet" });
    	liste.Add(new Customer { Id = 3, Name = "Emin" });
    }
    
    class Customer
    {
    	public int Id { get; set; }
    	public string Name { get; set; }
    }
    
    class CustomerEqualityComparer : IEqualityComparer<Customer>
    {
    	public bool Equals(Customer x, Customer y)=> x.Id == y.Id;
    
    	public int GetHashCode(Customer obj) => obj.Id;
    }

    Örnek kodda aynı id li ikinci kayıtlar eklenmeyecektir. Eklenmediği durumlarda Add metodu geriye false değerini dönecektir. Böylece kullanıcıyı bilgilendirebilirsiniz.


    www.cihanyakar.com



    8 Eylül 2019 Pazar 10:45
  •  var count = customerss.Count();//customer'in eleman sayısı.

    Eğer List üzerinde çalışıyorsanız kendisine ait Count özelliğini kullanın. Count() metodu işleri gereksiz karıştırmaktadır. 

    Sorunun kendisinde Id nin tekil olma koşulu varsa List değil HashSet kullanmanız daha uygun olacaktır.

    void Main()
    {
    	var liste = new HashSet<Customer>(new CustomerEqualityComparer());
    	liste.Add(new Customer { Id = 2, Name = "Cihan" });
    	liste.Add(new Customer { Id = 2, Name = "Mehmet" });
    	liste.Add(new Customer { Id = 3, Name = "Emin" });
    }
    
    class Customer
    {
    
    	public int Id { get; set; }
    	public string Name { get; set; }
    }
    
    class CustomerEqualityComparer : IEqualityComparer<Customer>
    {
    	public bool Equals(Customer x, Customer y)
    	=> x.Id == y.Id;
    
    	public int GetHashCode(Customer obj) => obj.Id;
    }

    Örnek kodda aynı id li ikinci kayıtlar eklenmeyecektir. Eklenmediği durumlarda Add metodu geriye false değerini dönecektir.


    www.cihanyakar.com

    Sağolun Cihan hocam. Biz koleksiyonları yeni geçtik ancak ne HashSet ne de Predicate falan görmedik ilerleyen Derslerde Predicate'i görecekmişiz bakalım. Bir çok şeyi geçtik, Classlar olsun Abstract class olsun, Interface olsun, Inheritance olsun. Ancak burada sizin yazmış olduğunuz bazı şeyleri yeni görüyorum ne yalan söyliyeyim :) Böyle şeyler görüncede ben mi bir yerde yanlış yapıyorum acaba eksik mi anlatılıyor diye düşünüyorum vallahi. Burada görmediklerimi şimdi araştırıyorum googleden :D

    8 Eylül 2019 Pazar 11:06
  • C#,.net oldukça hızlı gelişiyorlar. Müfredatlar ve eğitmenler yakalamakta zorlanıyorlardır. Ama HashSet, IEqualityComparer epeeey eski. Ya onlarda bilmiyor ya da ince konulara girmek istemiyorlar. 

    www.cihanyakar.com

    8 Eylül 2019 Pazar 11:17
  • C#,.net oldukça hızlı gelişiyorlar. Müfredatlar ve eğitmenler yakalamakta zorlanıyorlardır. Ama HashSet, IEqualityComparer epeeey eski. Ya onlarda bilmiyor ya da ince konulara girmek istemiyorlar. 

    www.cihanyakar.com

    Cihan hocam konuyla alakasız ama bir şey sormak istiyorum ;

    Şunun anlamı :  public int GetHasHCode(Customer obj)
    => obj.Id;

    Yani : =>  return anlamına geliyor sanırım doğru mu? Bu tür ifadelerle alakalı bilgi için hangi konuyu araştırmalıyım?

    Edit : Ve sanırım anladığım kadarıyla, köşeli parentez kullanmayıp böyle tek işlemler için => return yerine kullanabiliyoruz sanırım.



    9 Eylül 2019 Pazartesi 10:17
  • hayır return anlamına gelmiyor. Bir fonksiyon tanımlıyor.

    public int Topla(int Sayı1, int Sayı2)
    {
       return Sayı1 + Sayı2;
    }
    
    //ile 
    
    public int  Topla(int Sayı1, int Sayı2) => Sayı1 + Sayı2;
    
    //aynı şey.
    Bu daha çok parametresi fonksiyon olan methodlar için kullanılıyor.

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    9 Eylül 2019 Pazartesi 10:28
    Moderatör
  • hayır return anlamına gelmiyor. Bir fonksiyon tanımlıyor.

    public int Topla(int Sayı1, int Sayı2)
    {
       return Sayı1 + Sayı2;
    }
    
    //ile 
    
    public int  Topla(int Sayı1, int Sayı2) => Sayı1 + Sayı2;
    
    //aynı şey.
    Bu daha çok parametresi fonksiyon olan methodlar için kullanılıyor.

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    Hocam çok sagolun yanıtınız için.  "=>" bu ifadeden bahsettiniz değil mi? return keyword'u ile aynı işi görüyor işte return anlamına gelmiyor mu bir nevi :D

    9 Eylül 2019 Pazartesi 10:32
  • hayır return anlamına gelmiyor. Bir fonksiyon tanımlıyor.

    public int Topla(int Sayı1, int Sayı2)
    {
       return Sayı1 + Sayı2;
    }
    
    //ile 
    
    public int  Topla(int Sayı1, int Sayı2) => Sayı1 + Sayı2;
    
    //aynı şey.
    Bu daha çok parametresi fonksiyon olan methodlar için kullanılıyor.

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    Hocam çok sagolun yanıtınız için.  "=>" bu ifadeden bahsettiniz değil mi? return keyword'u ile aynı işi görüyor işte return anlamına gelmiyor mu bir nevi :D

     Func<int,int,int> Topla = (int Sayı1, int Sayı2) => {    return Sayı1 + Sayı2;};

    şeklinde yazarsan öyle olmuyor.


    www.cihanyakar.com



    9 Eylül 2019 Pazartesi 10:39
  • hayır return anlamına gelmiyor. Bir fonksiyon tanımlıyor.

    public int Topla(int Sayı1, int Sayı2)
    {
       return Sayı1 + Sayı2;
    }
    
    //ile 
    
    public int  Topla(int Sayı1, int Sayı2) => Sayı1 + Sayı2;
    
    //aynı şey.
    Bu daha çok parametresi fonksiyon olan methodlar için kullanılıyor.

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    Hocam çok sagolun yanıtınız için.  "=>" bu ifadeden bahsettiniz değil mi? return keyword'u ile aynı işi görüyor işte return anlamına gelmiyor mu bir nevi :D

     Func<int,int,int> Topla = (int Sayı1, int Sayı2) => {    return Sayı1 + Sayı2;};

    şeklinde yazarsan öyle olmuyor.


    www.cihanyakar.com



    Cihan hocam ben şu şekilde bir sorgulama yapmak istersem bunu nasıl yapabilirim?

    Aşağıda yazdığım kodla sorgulama yapamıyorum, tamam sizin bana verdiğiniz örnek hazır sınıflar ve metotlar var fakat kendim yapmak istersem sorgulamayı aşağıdaki mantıkla doğru olur mu? Sorgulamayı beceremedim bir türlü kafayı yedirdi bana

            class Test
            {
    
                public bool Equals(Customer x, Customer y)
                {
                    if (x.Id == y.Id)
                    {
                        return false;
    
                    }
                    else
                    {
                        return true;
                    }
                }
            }

    10 Eylül 2019 Salı 01:26
  • Direk Cihan'a yazıyorsun, bizim yazmamızda sorun yoktur sanırım?

    Equals methodu Object tipinden -neredeyse- tüm classlara miras kalır. Bir class tanımladığında otomatik olarak Object'ten miras almış olursun. Bu da Object'in virtual olan ToString, Equals ve GetHashCode methodları sende de olur ve istersen bunları ezip(override), yerine kendi methodlarını koyabilirsin demek.

    Aşağıdaki örnekte "Aynı renkteki elmalar birbirlerine eşittir" hedefini modelliyor.

    enum Renkler{
    	Kırmızı, Golden, Yeşil
    }
    
    class Elma
    {
    	public int Id { get; set; }
    	public Renkler Renk { get; set; }
    	public float Ağırlık { get; set; }
    	
    	public Elma(int Id, Renkler Renk, float Ağırlık)
    	{
    	        this.Id = Id;
    		this.Renk = Renk;
    		this.Ağırlık = Ağırlık;
    	}
    	
    	public override bool Equals(Object Obj)
    	{
    		if(Obj is Elma)
    		return ((Elma)Obj).Renk == this.Renk;
    		else return false;
    	}
        public override int GetHashCode()
        {
             return (int)this.Renk;
        } public static bool operator ==(Elma Elma1, Elma Elma2) => Elma1.Renk == Elma2.Renk; public static bool operator !=(Elma Elma1, Elma Elma2) => Elma1.Renk != Elma2.Renk; }


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com



    10 Eylül 2019 Salı 06:56
    Moderatör
  • Direk Cihan'a yazıyorsun, bizim yazmamızda sorun yoktur sanırım?

    Equals methodu Object tipinden -neredeyse- tüm classlara miras kalır. Bir class tanımladığında otomatik olarak Object'ten miras almış olursun. Bu da Object'in virtual olan ToString, Equals ve GetHashCode methodları sende de olur ve istersen bunları ezip(override), yerine kendi methodlarını koyabilirsin demek.

    Aşağıdaki örnekte "Aynı renkteki elmalar birbirlerine eşittir" hedefini modelliyor.

    enum Renkler{
    	Kırmızı, Golden, Yeşil
    }
    
    class Elma
    {
    	public int Id { get; set; }
    	public Renkler Renk { get; set; }
    	public float Ağırlık { get; set; }
    	
    	public Elma(int Id, Renkler Renk, float Ağırlık)
    	{
    	        this.Id = Id;
    		this.Renk = Renk;
    		this.Ağırlık = Ağırlık;
    	}
    	
    	public override bool Equals(Object Obj)
    	{
    		if(Obj is Elma)
    		return ((Elma)Obj).Renk == this.Renk;
    		else return false;
    	}
        public override int GetHashCode()
        {
             return (int)this.Renk;
        } public static bool operator ==(Elma Elma1, Elma Elma2) => Elma1.Renk == Elma2.Renk; public static bool operator !=(Elma Elma1, Elma Elma2) => Elma1.Renk != Elma2.Renk; }


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com



    Yok hocam olur mu öyle şey en son Cihan hoca yazdığı için yazdım Allah hepinizden tek tek razı olsun :) Ben şuan şunu anladım, bize dersler kesinlikle eksik anlatılıyor. Şimdi ADO.NET'i öğrenince Küçük çaplı kendimce programlar yazmaya başlayacağım belki o zaman bir tık ileri alırım işleri. Fakat  kafam karışmaya başladı ne yalan söyliyeyim :) Hocanın anlattığı her konuyu tekrar gözden geçirmeye başladım en önemli şeyleri kaçırır olmuşuz. her şey birbirine giriyor :S Çok sagolun Önay hocam eve geçince hemen detaylıca inceleyeceğim, takıldığım yer olursa adresiniz belli :D
    10 Eylül 2019 Salı 14:05
  • bu verdiğim örnek ilk sorunuzun cevabı değil. Sadece Equals ve == operatörünü anlamanıza yardımcı olsun diye paylaştım.

    Sorunuzda kolleksiyon içinde kullanacağınızda Mehmet Emin'in yanıtını dikkate almalısınız. Yani Any, All vs. Linq methodlarını kullanmalısınız.


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    11 Eylül 2019 Çarşamba 08:07
    Moderatör
  • bu verdiğim örnek ilk sorunuzun cevabı değil. Sadece Equals ve == operatörünü anlamanıza yardımcı olsun diye paylaştım.

    Sorunuzda kolleksiyon içinde kullanacağınızda Mehmet Emin'in yanıtını dikkate almalısınız. Yani Any, All vs. Linq methodlarını kullanmalısınız.


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    Anladım Önay hocam zaten onu Kullanıyorum tekrardan cok sagolun hepiniz'e ayrı ayrı teşekkür ederim
    11 Eylül 2019 Çarşamba 09:51
  • Listelerde LINQ kullanılabiliyor diye biliyorum

    misal

    dim Per=(From Prs in customerss where Prs.ID=2).firstordefault (vb.net)

    LINQ ile çok hızlı sorgular yapabilirsiniz. hatta listedeki key elemanına bağlı kalmadan. araştırın derim.

    aşağıdaki kod çalıştı. hoş var değişken kullandım C# fazla bilmiyorum. ama LINQ kullanabiliyormuşuz.

        class Customer
        {
            public int Id { get; set; }
            public string FirstName { get; set; }

        }


        static class Program {

            static void Main() {
                List<Customer> customerss = new List<Customer>
                {
                    new Customer{FirstName = "Elvent", Id = 1},
                    new Customer{FirstName = "Ahmet", Id = 2}
                };

                var count = customerss.Count();//customer'in eleman sayısı.

                var customer2 = new Customer
                {
                    Id = 3,
                    FirstName = "Salih",
                };
                customerss.Add(customer2);//customerss adlı nesnemize customer2'yi ekledik.

                //Customerin içinde tanımladığımız "customerss" müşterisine yeni bir ekleme yapmak istersek alttaki AddRangeyi kullanmamız gerekir.
                customerss.AddRange(new Customer[2]//Burada Bize diyor ki Array bazlı liste ver bende customerss'in içine ekliyeyim.
                    {
                        new Customer{FirstName = "Ali", Id = 4}, //genelde bunu elimizde bir veri tabanı varken, yeni bir liste geldiği zaman altına eklemek için kullanırız.
                        new Customer{FirstName = "Yılmaz", Id = 5}
                    }
                );

                var Cstmr = (from Cst in customerss where Cst.Id == 4 select Cst);

                if (!(Cstmr is null))
                {
                    Console.WriteLine("Böyle bir ID bulundu");
                }
                else
                {
                    Console.WriteLine("Böyle bir ID bulunamadı.");
                }


            }
        }
    }

     
    • Düzenleyen SinanZorlu 12 Eylül 2019 Perşembe 11:22
    12 Eylül 2019 Perşembe 10:59
  • Listelerde LINQ kullanılabiliyor diye biliyorum

    misal

    dim Per=(From Prs in customerss where Prs.ID=2).firstordefault (vb.net)

    LINQ ile çok hızlı sorgular yapabilirsiniz. hatta listedeki key elemanına bağlı kalmadan. araştırın derim.

    aşağıdaki kod çalıştı. hoş var değişken kullandım C# fazla bilmiyorum. ama LINQ kullanabiliyormuşuz.

        class Customer
        {
            public int Id { get; set; }
            public string FirstName { get; set; }

        }


        static class Program {

            static void Main() {
                List<Customer> customerss = new List<Customer>
                {
                    new Customer{FirstName = "Elvent", Id = 1},
                    new Customer{FirstName = "Ahmet", Id = 2}
                };

                var count = customerss.Count();//customer'in eleman sayısı.

                var customer2 = new Customer
                {
                    Id = 3,
                    FirstName = "Salih",
                };
                customerss.Add(customer2);//customerss adlı nesnemize customer2'yi ekledik.

                //Customerin içinde tanımladığımız "customerss" müşterisine yeni bir ekleme yapmak istersek alttaki AddRangeyi kullanmamız gerekir.
                customerss.AddRange(new Customer[2]//Burada Bize diyor ki Array bazlı liste ver bende customerss'in içine ekliyeyim.
                    {
                        new Customer{FirstName = "Ali", Id = 4}, //genelde bunu elimizde bir veri tabanı varken, yeni bir liste geldiği zaman altına eklemek için kullanırız.
                        new Customer{FirstName = "Yılmaz", Id = 5}
                    }
                );

                var Cstmr = (from Cst in customerss where Cst.Id == 4 select Cst);

                if (!(Cstmr is null))
                {
                    Console.WriteLine("Böyle bir ID bulundu");
                }
                else
                {
                    Console.WriteLine("Böyle bir ID bulunamadı.");
                }


            }
        }
    }

     

    Sinan bey,

    Soru mu soruyorsunuz, cevap mi veriyorsunuz? Sanki soruyor gibisiniz.

    C# ile yazanlar:

    dim Per=(From Prs in customerss where Prs.ID=2).firstordefault 

    seklinde bir kodu (yeni başlamadılarsa) yazmazlar. ID genellikle primary key olarak kullanılır. Bu durumda kullanmanız gereken:

    var per = Customerss.SingleOrDefault(c => c.ID == 2);

    Soruya cevap vermeye calistiysaniz, zaten daha ilk verilen cevapta sorunun cevabi var:

    var mevcut = customerss.Any(c => c.ID == 2);

    ("C#'ta Linq kullanabiliyormusuz" - Hoş bir espri olmuş, sanki VB degil Linq'nin kaynağı F# ile yazıyormuşsunuz gibi :)



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    12 Eylül 2019 Perşembe 13:43
    Yanıtlayıcı
  • Size cevap verebilmeyi çok isterdim eğer düzgün okumuş ve anlamış olsa idiniz. tamamen dikkatsiz bir okuma üzerinden yaptığınız hatalı yoruma cevap vermek daha büyük hataya sebep olacaktır. lütfen biraz daha dikkatli okuyun. gerekirse fontu biraz büyütün, bazı harfleri atlamış olabilirsiniz.
    13 Eylül 2019 Cuma 05:12
  • Sinan kardeş; "Listelerde LINQ kullanılabilir diye biliyorum ..." ile başlayan bir yazıyı font size'ı ne olursa olsun okumaya gerek yok zaten. Bence sen verilmiş yanıtları önce bir oku sonra yaz. Okumadan bilmeden yazıp biri gelip seni eleştirince de atarlanma bence.

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    13 Eylül 2019 Cuma 07:04
    Moderatör