5 Ağustos 2013 Pazartesi

ASP.NET Hazır Metodla Dizileri Karşılaştırmak


Bozuntu.. Hayal kırıklığı... Direniş... Neler yaşamadım ki o gün.. :(

Halbuki tek yapmak istediğim iki dizinin elemanlarını karşılaştırmaktı. Ve bunu yapmak için .Net'te hazır metodun mutlaka olacağını savunmaktı.. For döngülerine girmek kodlarımın yakışıklılığını bozacaktı. Buna nasıl izin verirdim? Nasıl?? (Nedense for döngülerine önceden beri gıcığım var. Elektirik uyuşmazlığı sanırım.)

İlk denediğim metot SequenceEqual  metoduydu ve ilk intibası iyiydi.. Şansına olmalı; doğru(yani istediğim gibi) çalıştı ilk başta, ama sonra veri tabanından çekip diziye attığım GUID lerin ve metoduma parametre olarak gelen dizinin GUID lerinin sırası aynı değilse SequenceEqual ın doğru(istediğim gibi :p) çalışmadığını farkettim. Yani SequenceEqual sadece sırası aynı olan dizilerde benim "istediğim gibi" çalışıyordu. (adından da belli aslında ya..)

Bu durumda ben de dizileri sıralayıp öyle SequenceEqual metodunu kullanırım diye sıralama çalışmalarına başlamıştım ki...

İlk darbe yazılım müdürümden geldi...

-Bitti mi?
-(sağa sola kafa sallayış.)
-Ne zaman biter? 
-Eee ööö.. (Ekranımda hata penceresi.)
-Bu ne, nerede takıldın?
-Yok yaa o birşey değil,, saçma birşey denedim de onun hatası.
-Bana da söyle de seninle dalga geçeyim canım sıkıldıkça. (zalımca bir sırıtış)

Ve ben kızara bozara OrderByDescending metoduyla bir türlü aynı sırada sıralanmayan GUID lerimi bir de stringe çevirip sıralamayı denediğimi açıkladım.

-Nihahaha...
-....
-.... Yoo hiç de saçma bişey denememişsin aslında ver bakayım... 
- :S
- .... Yok olmadı. Neden sıralamazsa zaten bu OrderByDescending .. Zaten sıralamak zorunda mısın ki SequenceEqual la yapma For ların içinde Contains le yap bakalım hadi. Kolay gelsin.
- :/// 

Benim Mono damarım tutmuştu bir kere, hiç öyle yapar mıydım? :P Tabii ki hayır.
Biraz daha araştırdım ve şu iki hoş metodu buldum. Bulmakla kalmadım kullandım bilee, ne haber. ;)

Şimdii, madem böyle havalanmayı başardın yine,, başlangıçta neden o kadar duygu sömürüsüylen girdin be çocuk diyebilinir.. Ama içimde kopan fırtınaları bir ben bir de Allah bilir. :( :P


  • Bulduğum metotlar;


 string[] sonuc = dizi1.Except(dizi2).ToArray();
//dizi2'de bulunup dizi1'de bulunmayan elemanları sonuç dizisine aktarır. 

string[] sonuc = dizi1.Intersect(dizi2).ToArray();
//dizi1 ve dizi2'de ortak olarak bulunan elemanları sonuç dizisine aktarır.


  • Bulduğum blog;

http://selcukpeksen.blogspot.com/2013/04/c-iki-array-karslastrlmas.html


  • Benim kullanımım;

public static Guid GetGroupId(Guid[] toPersonIdList, Guid userId)
{
   HarmonyEntities harmonyEntities = DatabaseEntities.GetEntities;

   List<Guid> allPeople = new List<Guid>();
   allPeople.Add(userId);
   foreach (var item in toPersonIdList)
   {
    allPeople.Add(item);
   }

   if (allPeople.Count == 2)
   {
   //Her grup için kişiler kontrol edilir.
   Guid[] allPeopleId = allPeople.ToArray();

   var groups = (from p in harmonyEntities.VDB_ASSET_RELATIONS
                 where allPeopleId.Contains(p.GUID_ASSET_Y) &&
                 p.GUID_RELATION_TYPE == Structs.SMSParams.EMessageGroupRT &&
                 p.PRM1 == 1
                 select p.GUID_ASSET_X).Distinct().ToArray();

   foreach (var grup in groups)
   {
    //prm1 i -1 e çekilmiş kayıt varsa 2 kişinin grubu o grup değildir..
    var peopleList = (from p in harmonyEntities.VDB_ASSET_RELATIONS
                      where p.GUID_ASSET_X == grup &&
                      p.GUID_RELATION_TYPE == Structs.SMSParams.EMessageGroupRT
                      select p).OrderByDescending(p => p.GUID_ASSET_Y).Select(p => p.GUID_ASSET_Y).Distinct().ToArray();

    //Eğer dizilerde farklı eleman yoksa o grup numarasını döndür.
    if (peopleList.Except(allPeopleId).ToArray().Count() == 0)
    {
    return grup;
    }
    else
    {
    continue;
    }
    }

    }
  //Eğer mevcut grup bulunamadıysa yeni grup insert edilir.
  return CreateNewGroup(userId, allPeople.ToArray());
}
  • SequenceEquals ın örnek kullanımı;


int[] a = new[] { 3, 5, 6, 8, 9, 3 };

int[] b = new[] { 3, 5, 6, 8, 9, 3 };


bool esitMi = a.SequenceEqual(b);


  • Postun Sonu;


Hayırlı işler, bol kazançlar, Sevgiler, Saygılar..

Bir de iyi bayramlar.
Büyüklerimin ellerinden öpüp içimden keşke hâlâ bana harçlık veren olsa diye geçirip, küçüklerimin yanaklarını sıkıp saçlarını karıştırıp, yaşıt hemcinslerimle sarılıp, karşı cinse başımı hafifçe eğip yan yan sırıtıp, yabancılara da biraz mesafeli bir tavırla bayramınız mübareeek olsunn deyiip,, bu postu noktalıyorum. :))

Hiç yorum yok:

Yorum Gönder