none
İçiçe Sonsuz Döngü ile metin kombinasyonu oluşturma RRS feed

  • Soru

  • Merhabalar,

    Aşağıda görselde göstermiş olduğum gibi N sayıdaki array içinde ki N sayıda ki değerlerin kombinasyonları oluşturularak aşağıdaki gibi örnek metinler üretmem gerekmekte. Algoritmayı kuramadım nasıl bir yapı oluşturabilirim. Veritabanı yapım aşağıdaki şekilde.

    Parametre Tablosu
    Id (int)
    Name (string)
    Values (List<Value>)

    Value Tablosu
    Id (int)
    ParametreId (int)
    Value (string)

    Oluşturulması gereken metinler:

    İstanbul şehrinde Ali Kırmızı renkli Araba satın aldı. İstanbul şehrinde Ali Kırmızı renkli Otobüs satın aldı. İstanbul şehrinde Ali Kırmızı renkli Uçak satın aldı.

    .
    .
    .

    Toplamda ekteki örneğe göre 288 satır oluşturması gerekmekte.

    24 Aralık 2018 Pazartesi 08:55

Tüm Yanıtlar

  • public class ValueClass
    {
        public int Id { get; set; }
        public int ParameterId { get; set; }
        public string Value { get; set; }
    }
    
    public class ParameterClass
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<ValueClass> Values { get; set; }
    
        public ParameterClass()
        {
            Values = new List<ValueClass>();
        }
    }
    
    public List<ParameterClass> LoadData()
    {
        List<ParameterClass> parameters = new List<ParameterClass>();
        // Veri tablolarınızdan okuyarak doldurmanız gereken liste. 
        // Örnek verilerle dolduruyorum.
        ParameterClass parameter = new ParameterClass() { Id = 1, Name = "[ŞEHİR]" };
        parameter.Values.Add(new ValueClass() { Id = 1, ParameterId = 1, Value = "İstanbul" });
        parameters.Add(parameter);
        parameter = new ParameterClass() { Id = 2, Name = "[KİM]" };
        parameter.Values.Add(new ValueClass() { Id = 2, ParameterId = 2, Value = "Ali" });
        parameters.Add(parameter);
        parameter = new ParameterClass() { Id = 3, Name = "[RENK]" };
        parameter.Values.Add(new ValueClass() { Id = 3, ParameterId = 3, Value = "kırmızı" });
        parameters.Add(parameter);
        parameter = new ParameterClass() { Id = 4, Name = "[NE]" };
        parameter.Values.Add(new ValueClass() { Id = 4, ParameterId = 4, Value = "araba" });
        parameter.Values.Add(new ValueClass() { Id = 5, ParameterId = 4, Value = "otobüs" });
        parameter.Values.Add(new ValueClass() { Id = 6, ParameterId = 4, Value = "uçak" });
        parameters.Add(parameter);
        // Veri listesi sonu.
        return parameters;
    }
    
    public string Apply(List<ParameterClass> parameters, string text = "[ŞEHİR] şehrinde [KİM] [RENK] renkli [NE] satın aldı.")
    {
        string result = "";
        string temp;
        int maxLength = parameters.OrderByDescending(p => p.Values.Count).First().Values.Count();
        for (int v = 0; v < maxLength; v++)
        {
            temp = text;
            for (int p = 0; p < parameters.Count; p++)
            {
                temp = temp.Replace(parameters[p].Name, $"{parameters[p].Values[Math.Min(v, parameters[p].Values.Count - 1)].Value}");
            }
            result += temp;
        }
        return result;
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show(Apply(LoadData()));
    }
    


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    24 Aralık 2018 Pazartesi 10:35
  • Öncelikle yanıtınız için teşekkür ederim.. İstediğimi kısmen karşılasa da tam olarak ihtiyacım olan sonucu vermemekte.Biraz daha detaylandırmam gerekirse aşağıda ki gibi bir sonuca ihtiyacım varç
    24 Aralık 2018 Pazartesi 18:51
  • Verdiginiz ornekle 288 rakamını nasıl buldunuz? 240 degil mi, 1 tane daha yemek olsaydi o zaman 288 olurdu ama bu bence 240. Lütfen resim yerine kod vermeye özen gösterin, resim kimsenin isine yaramıyor. SQL ile çözmek isterseniz:

    WITH [sehir] AS ( SELECT v.[value] FROM contentParameter p INNER JOIN contentValue v ON v.ParameterId=p.id WHERE p.[name]='[[sehir]]'), [yemek] AS ( SELECT v.[value] FROM contentParameter p INNER JOIN contentValue v ON v.ParameterId=p.id WHERE p.[name]='[[yemek]]'), [icecek] AS ( SELECT v.[value] FROM contentParameter p INNER JOIN contentValue v ON v.ParameterId=p.id WHERE p.[name]='[[icecek]]'), [araba] AS (SELECT v.[value] FROM contentParameter p INNER JOIN contentValue v ON v.ParameterId=p.id WHERE p.[name]='[[araba]]') SELECT s.[value] as [sehir],
    y.[value] as [yemek],
    i.[value] as [icecek],
    a.[value] as [araba]
    FROM [sehir] s, [yemek] y, [icecek] i, [araba] a;




    24 Aralık 2018 Pazartesi 20:02
    Yanıtlayıcı
  • Yeni bir parametre eklenirse ne olacak?

    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    24 Aralık 2018 Pazartesi 20:47
  • Yeni bir parametre eklenirse ne olacak?

    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    Fark etmez ki. Su anki yapinin bir mantigi yok, ayni sekilde devam eder gider.
    24 Aralık 2018 Pazartesi 21:13
    Yanıtlayıcı
  • Matematikte bunun karşılığı kombinasyondur. 

    Caner Alçılıoğlu,

    Bu sorunuzdaki durum, sadece bir kez ve sadece bu parametreler ile mi var?

    Yoksa parametreler değişebilir mi?


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    24 Aralık 2018 Pazartesi 21:43
  • Verdiginiz ornekle 288 rakamını nasıl buldunuz? 240 degil mi, 1 tane daha yemek olsaydi o zaman 288 olurdu ama bu bence 240. Lütfen resim yerine kod vermeye özen gösterin, resim kimsenin isine yaramıyor. SQL ile çözmek isterseniz:

    WITH [sehir] AS ( SELECT v.[value] FROM contentParameter p INNER JOIN contentValue v ON v.ParameterId=p.id WHERE p.[name]='[[sehir]]'), [yemek] AS ( SELECT v.[value] FROM contentParameter p INNER JOIN contentValue v ON v.ParameterId=p.id WHERE p.[name]='[[yemek]]'), [icecek] AS ( SELECT v.[value] FROM contentParameter p INNER JOIN contentValue v ON v.ParameterId=p.id WHERE p.[name]='[[icecek]]'), [araba] AS (SELECT v.[value] FROM contentParameter p INNER JOIN contentValue v ON v.ParameterId=p.id WHERE p.[name]='[[araba]]') SELECT s.[value] as [sehir],
    y.[value] as [yemek],
    i.[value] as [icecek],
    a.[value] as [araba]
    FROM [sehir] s, [yemek] y, [icecek] i, [araba] a;




    Evet haklısınız yanlış hesaplamışım. Kodlarımda bir anlam bütünlüğü sağlayamadığım ve adam akıllı çalışan bir kod ortaya çıkaramadığım için bu şekilde betimlemeye çalıştım. İlginiz için teşekkür ederim ancak burada ki parametre ve değerler N sayıda ve dinamik olarak veritabanından gelmekte.
    24 Aralık 2018 Pazartesi 21:47
  • Matematikte bunun karşılığı kombinasyondur. 

    Caner Alçılıoğlu,

    Bu sorunuzdaki durum, sadece bir kez ve sadece bu parametreler ile mi var?

    Yoksa parametreler değişebilir mi?


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    İlginiz için teşekkür ederim. Parametreler dinamik olarak geldiği için sorun yaşıyorum. Örnek olarak 2-3 parametrede çalıştırabiliyorum ancak parametre sayısı belirsiz olduğu için sorunuma bir çözüm bulamadım.
    24 Aralık 2018 Pazartesi 21:48
  • Adam akilli bir kod ortaya çıkmaz çünkü dediğim gibi daha ortada mantık yok. "Dinamik olarak geldigi icin" demissin mesela, ne nereden nasıl geliyor belli degil.

    Bu sadece o resimdekine ornek, mantigi bilseydim biraz daha iyi birseyler yazabilirdim herhalde. Muhtemelen de olayı on yüzde çözerdim. Temelde yapılan cross join. 

     
    24 Aralık 2018 Pazartesi 21:56
    Yanıtlayıcı
  • Parametreleri Values.Count sıralamasına alıp ikişerli gruplar halinde kombinasyonlarını almak sorununuzu çözecektir.

    Ama bunu uygulamak kolay değil. Siz de bu yaklaşımı uygulamaya çalışabilirsiniz. Ben de zaman bulduğumda uygulamaya çalışırım. 


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    24 Aralık 2018 Pazartesi 21:56
  • Matematikte bunun karşılığı kombinasyondur. 

    Caner Alçılıoğlu,

    Bu sorunuzdaki durum, sadece bir kez ve sadece bu parametreler ile mi var?

    Yoksa parametreler değişebilir mi?


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    Matematikte bunun karsiligi kombinasyon degildir. 
    24 Aralık 2018 Pazartesi 21:59
    Yanıtlayıcı
  • Adam akilli bir kod ortaya çıkmaz çünkü dediğim gibi daha ortada mantık yok. "Dinamik olarak geldigi icin" demissin mesela, ne nereden nasıl geliyor belli degil.

    Bu sadece o resimdekine ornek, mantigi bilseydim biraz daha iyi birseyler yazabilirdim herhalde. Muhtemelen de olayı on yüzde çözerdim. Temelde yapılan cross join. 

     
    public class ContentTemplate
        {
            [Key]
            public int Id { get; set; }
            [StringLength(100)]
            public string Name { get; set; }
    
            [StringLength(250)]
            public string Title { get; set; }
            [StringLength(500)]
            public string ShortDescription { get; set; }
    
            [StringLength(250)]
            public string MetaTitle { get; set; }
            public string MetaKeyword { get; set; }
            [StringLength(250)]
            public string MetaDescription { get; set; }
            public string Template { get; set; }
    
            public int CategoryId { get; set; }
            public int GalleryId { get; set; }
    
            [ForeignKey("CategoryId")]
            public virtual Category Category { get; set; }
    
            [ForeignKey("GalleryId")]
            public virtual Gallery Gallery{ get; set; }
    
            public virtual List<ContentParameter> Parameters { get; set; }
        }


     public class ContentParameter
        {
            public int TemplateId { get; set; }
            [Key]
            public int Id { get; set; }
            [StringLength(250)]
            public string Name { get; set; }
    
            [ForeignKey("TemplateId")]
            public virtual ContentTemplate Template { get; set; }
    
            public virtual List<ContentValue> Values { get; set; }
        }


    public class ContentValue
        {
            public int ParameterId { get; set; }
            public int Id { get; set; }
            public string Value { get; set; }
    
            [ForeignKey("ParameterId")]
            public virtual ContentParameter Parameter { get; set; }
    
        }

    Tablo yapılarım bu şekilde. Burada yapılmak istenen mantığı şu şekilde açıklayabilirim. Örneğin

    TOFAS-FIAT DOBLO PANORAMA PREMIO 1.6 M.JET 90 E5 C.MATIC Marka aracinizin Oto beyin tamiri hizmeti ülkemizde ve dünyada gelisen teknoloji ile birlikte Kaya Elektroniktarafindan yillardir sürekli uygulanan islemlerden bir tanesi olmustur. TOFAS-FIAT DOBLO PANORAMA PREMIO 1.6 M.JET 90 E5 C.MATIC Marka aracinizin Oto beyni ECU denilen sistemle de ifade edilmektedir. ECU; motor yönetiminden kontrollerinden sorumludur ve motorun hareketlerini, çalisma prensibini sürekli denetler. Birçok çevresel sarti(sicaklik, yogunluk, basinç, devir, hiz vb.) da göz önünde bulundurarak motora olan etkilerini saptamaya çalisir sürekli olarak.

    otobeyintamiriblog.wordpress.com sitesinde yapılmış olan makale üretme tekniğine bakılırsa sabit bir makale içerisinde sadece araç modeli değiştirilmekte. Yani benim kurmak istediğim yapıya göre tek parametreli. Burda üretilecek olan yazılarda ise örneğin araç modeli, şehir, marka, tür, renk gibi farklı parametrelerde ekleyerek daha fazla yazı üretebilme ve bu yazıların nispeten daha özgün olabilmesini hedeflemekteyim. Yani yukarıda ki yazıyı geliştirerek 

    doblo model aracınızın izmir ilinde mercedes yetkili servisleri ile......

    golf 4 model aracınızın izmir ilinde mercedes yetkili servisleri ile.....

    ...

    ...

    golf 4 model  aracınızın istanbul ilinde mercedes yetkili servisleri ile..... 

    gibi çoklu parametreler ile yazılar üretmeye çalışmaktayım.

    24 Aralık 2018 Pazartesi 22:06
  • Kusura bakma anlattıkların sana bireyler ifade ediyordur ama benim icin anlaşılmaz seyler. 
    24 Aralık 2018 Pazartesi 22:41
    Yanıtlayıcı
  • CetinBasoz,

    Bu kadar kesin hükümlerde bulunduğunuza göre ya kombinasyon konusunda büyük bir otoritesiniz yada bu konuda hiç bir fikriniz yok. 

    Soruyu soran problemini anlatmış. Bu, bir uygulama talebi olarak size gelseydi, bir profesyonel olarak, bu yanıtlarda yazdıklarınızı söyler miydiniz?

    Sizi, kimse, bu sorunun çözülmesi gerektiğine ikna etmek zorunda değil.

    Size anlamsız geliyorsa yanıt vermemeyi tercih edebilirsiniz.

    Yanıt vermeye çalışan biri olarak tavrınızdan duyduğum rahatsızlığı belirtmek istedim.

    Umarım saygıyla karşılarsınız.

    Çalışmalarınızda başarılar dilerim.


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    • Düzenleyen MuratAKSARAY 25 Aralık 2018 Salı 09:56 imlâ düzeltmesi
    25 Aralık 2018 Salı 07:51
  • Kombinasyon konusunda otorite olmak da neymiş :) Basit bir matematik bilgisi sadece. Siz kombinasyonun ne oldugunu bilmiyorsunuz diye bu konuda fikir beyan edenler ya otorite ya da hiçbir şey bilmiyor öyle mi? Oyle olsun, ben hiçbir şey bilmiyorum.

    Bu bana gelseydi, bir profesyonel olarak, kafama gore karanlıkta atis yapmak yerine, yukarıda sorduğum gibi detaylarını sorardım. Sordum cevabini alamadım. Siz sanki olayı anlamış gibisiniz, öyleyse anlatsaydınız da biz de anlasaydık.

    Ben bu forumu sizin gibiler yüzünden terk etmiştim, gene sizin gibi birisi cikti karşıma. Ne sans ama.

    25 Aralık 2018 Salı 09:59
    Yanıtlayıcı

  • Ben bu forumu sizin gibiler yüzünden terk etmiştim, gene sizin gibi birisi cikti karşıma. Ne sans ama.

    Anlamayacağınızı biliyordum.

    Günümüz yaygın yaşam formunun kusursuz bir örneğisiniz. 

    Beni tanımadığınız halde "sizin gibiler" diyecek düzeydesiniz. 

    Kombinasyonu, bir formülden ibaret "basit bir bilgi" sanacak düzeyde matematik bilgisine sahipsiniz.

    Yanıt vermek yerine başkalarının sorusunu ve yanıtlarını küçümsemeye çalışmak ne büyük bir meziyet.

    Asıl kötü şans "benim gibiler"in olmalı. Tıpkı "benim gibi"lerin yaptığı gibi siz de çok kimseye yardım ediyorsunuz. Sadece "benim gibiler" bunu kibir yada ego kaynağı olarak kullanmıyor. 

    Ne demek, soruyu anladıysanız bana da anlatsaydınız?

    Yıllar önce izah etmeye çalıştığım bir konuda da benzer tavrı sergilediğinizi hatırlıyorum.

    "Olmaz diyorsam olmaz" dediğiniz sorudakine benzer konuda, Faronics firması Anti-Executable isimli bir güvenlik yazılımı geliştirdi.

    Sanırım size de sormadılar. "Benim gibiler" araştırıyor ve uygulamaya çalışıyor.

    Sizin araştırmaya veya anlamaya çalışmaya ihtiyacınız yok. Zaten biliyorsunuz.

    Yolunuz açık olsun.


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    25 Aralık 2018 Salı 11:06
  • Hakikaten bıktım sizin gibilerden, nolur isinize bakin. 


    25 Aralık 2018 Salı 11:25
    Yanıtlayıcı
  • Öncelikle şunu belirtmek isterim evde oturup aklıma şu geldi hadi yazayım demek için başlanılan bir proje değil. İşimize bakıyoruz şuan işimiz bu ve biz bu işimizle 7 yıldır bu sektörden ben ve çalışanlarımın rızıklarını kazanıyoruz. Tecrübelerinize saygı duyuyorum Çetin bey ancak bu ukala bir üslupla cevaplandırmanızı gerektirmez. Ne yazıkki ülkemizde soru sorana dilenci muamelesi yapan kendini şefaatçi sananlardan dolayı bilgi ne paylaşılıyor nede paylaştıkça büyüyor. 

    Hata sizde değil sakın yanlış anlamayın eşeklik bende ki buraya 2 satır kod atıp bu neden çalışmıyor diye sormadım. Ne de olsa yazılımcı olmak birbirine benzer yapıları tekrar tekrar yazmak, virgül koymayı unuttum veritabanına bağlanamadım, gibi basit bi soru sorsam ve cevabımı alınca yanıt olarak işaretlesem egonuz tatmin olacak ulan ne büyük yazılımcıyım be ! diyecektiniz kusura bakmayın bu kez o ekmek çıkmadı.

    Yardım eden diğer arkadaşlara teşekkür ediyorum. Projeyi er veya geç çalıştırır burada da paylaşırım.
    25 Aralık 2018 Salı 13:02
  • Ne yazik ki asil mesele kisilerin sorularını acikca ifade edememesinden kaynaklanıyor. Sonra bir de uzerine bağcıyi dövmek misali gider yapmalar, of of.

    2 satir kodu keske yazsaydınız, sorunuz belki anlasilir olurdu. Size cevap yazılıp, açıklama istendiğinde gene hikaye anlattınız ben de anlamadigimi söyledim.

    Utanmadan üstüne nankörlük edip, insanlara ukalalık etme, egonu tatmin etme filan gibi yakistirmalar yapmayın. Ben sizin işaretinizle yazilimci olmadım, insani güldürmeyin.

    Ulkemizde soru sorana dilenci muamelesi yapılıyor diye sizlanacaginiza, sorunuzu ayni sekilde yurtdisinda, ornegin StackOverflow'da sorun. Dayak yemişten beter olup, sorunuzu silmezseniz ya da moderatorler silmez / kilitlemezse o zaman hakikaten haklisiniz derim. 

    Suc bende ki, yardim etmeye kalkistim.

    25 Aralık 2018 Salı 13:32
    Yanıtlayıcı