C# 2 List<T> Karşılaştırma
-
Merhaba Arkadaşlar,
Elimde 2 liste var. Bu listeyi karşılatırmak ve bu karşılaştırma sonucu hangi kayıtların update,create,delete olacağına karar vermek istiyorum.
List<Address> şekilnde. Address nesnesi içeriği ID ve SourceKey var. Benim yapmak istediğim. Gelen liste ve bende ki listeyi ID ve SourceKey ile kontrol edip.
1- Karşıdan Gelen ve Bende olanları bulup Update etmek
2- Karşıdan Gelen ama Bende olmayanları Create etmek
3- Karşıdan Gelen, Karşı listede olmayan ama bende olan kayıtlarıda Delete etmek.
2 listenin karşılaştırmasıda ID ve SourceKey eşitliği ile yapılacak.
-
3. maddeyi biraz daha açıklar mısın?
-
JPriest bunu yazdı
3. maddeyi biraz daha açıklar mısın?
Şöyle ki hocam:
Örneğin adam önceden 3 kayıt yollamıştı ve sisteme 3 adres kaydı almıştım. Sonrasında kendi tarafında 2 sini sildi ve bana tek bir adres yolladı. Bu durumda benim, bana yollanan listede olmayan ama bende olan kayıtları bulup kendi tarafımdan da silmem gerekiyor.
-
Ben mi yanlış anlıyorum yoksa senin elindeki listenin hiçbir geçerliliği yok mu? Karşıda yoksa sildirdin, varsa eklettin, sendeki ile uyuşmadığında karşıdakini aldın. Ee sende niye liste duruyor ki?
-
YeniHarman bunu yazdı
Ben mi yanlış anlıyorum yoksa senin elindeki listenin hiçbir geçerliliği yok mu? Karşıda yoksa sildirdin, varsa eklettin, sendeki ile uyuşmadığında karşıdakini aldın. Ee sende niye liste duruyor ki?
Hocam sanırım yalnış anladınız. Bende ki liste ile gelen listeyi katşılaştırıyorum. Karşıda yoksa ve bende varsa benden siliyor, bende varsa update edior, karşıda var bende yoksa create yapıor.
-
3 tane fonksiyon yazsan. Elindeki listenin ID'sini aldıktan sonra gelen verideki listeyi tek tek dolaşsa ve aynı ID'ye sahip verileri update,delete,insert vs vs neyse yapsa ?
Verimli bir çözüm değil ama günü kurtarır. İleride kalan vaktinde tekrar yaparsın birşeyler :D
-
GodKlaus bunu yazdı
3 tane fonksiyon yazsan. Elindeki listenin ID'sini aldıktan sonra gelen verideki listeyi tek tek dolaşsa ve aynı ID'ye sahip verileri update,delete,insert vs vs neyse yapsa ?
Verimli bir çözüm değil ama günü kurtarır. İleride kalan vaktinde tekrar yaparsın birşeyler :D
Hocam aslında konuda belirtmedim hala hazırda hızlıca bu şekilde yapmıştım :) Daha üst seviye çözümler çıkar vs diye düşünerek konu açayım aydınlanayım dedim. Linq vs denedim ancak pek bilmediğimden oldurmadım.
Ek olarak sadece ID değil + SourceKey de var.
-
Yukarıdaki link işini fazlasıyla görecektir hocam
-
Absolut bunu yazdıYeniHarman bunu yazdı
Ben mi yanlış anlıyorum yoksa senin elindeki listenin hiçbir geçerliliği yok mu? Karşıda yoksa sildirdin, varsa eklettin, sendeki ile uyuşmadığında karşıdakini aldın. Ee sende niye liste duruyor ki?
Hocam sanırım yalnış anladınız. Bende ki liste ile gelen listeyi katşılaştırıyorum. Karşıda yoksa ve bende varsa benden siliyor, bende varsa update edior, karşıda var bende yoksa create yapıor.
yeni sende ki liste karsidakine eşit oluyor her seferinde. yani sende ki listenin önemi yok karşidan gelen hep aktif olan ?
-
rakkoc bunu yazdıAbsolut bunu yazdıYeniHarman bunu yazdı
Ben mi yanlış anlıyorum yoksa senin elindeki listenin hiçbir geçerliliği yok mu? Karşıda yoksa sildirdin, varsa eklettin, sendeki ile uyuşmadığında karşıdakini aldın. Ee sende niye liste duruyor ki?
Hocam sanırım yalnış anladınız. Bende ki liste ile gelen listeyi katşılaştırıyorum. Karşıda yoksa ve bende varsa benden siliyor, bende varsa update edior, karşıda var bende yoksa create yapıor.
yeni sende ki liste karsidakine eşit oluyor her seferinde. yani sende ki listenin önemi yok karşidan gelen hep aktif olan ?
Bende ki liste karşıya eşit olmuyor sürekli. Karşıdan gelen bende ki listeden az olduğuda olabilir. Bende 7 kayıt varken karşıdan 3 geliyor olabilir.
@Yazilimci eyw müdür aydınlatma yaşattın bu yaşımdan sonra ellerin dert görmesin.
-
15 dakikada yazdım, testleri yaptım işini görüyor hocam.
List yerine Hashset kullanman performans açısından daha iyi olur etc. Kodda performans olarak hatalar var, gerekli vakit olmadığı için yaz geç yaptım umarım işini görür.
public class Adress { public int Id { get; set; } public int SourceKey { get; set; } public string Value { get; set; } /* Silinecek kayıtları burda tutalım*/ public bool IsDelete { get; set; } = false; } static void Main(string[] args) { List<Adress> localAdressList = new List<Adress>(); localAdressList.Add(new Adress { Id = 1, SourceKey = 2, Value = "tbtbtbtbt" }); localAdressList.Add(new Adress { Id = 2, SourceKey = 3, Value = "saybirs" }); localAdressList.Add(new Adress { Id = 3, SourceKey = 4, Value = "çükübik" }); List<Adress> serverAdressList = new List<Adress>(); serverAdressList.Add(new Adress { Id = 1, SourceKey = 2, Value = "tahribat.com" }); serverAdressList.Add(new Adress { Id = 2, SourceKey = 3, Value = "saybirs" }); serverAdressList.Add(new Adress { Id = 3, SourceKey = 4, Value = "çükübik" }); for (int i = 0; i < localAdressList.Count; i++) { int rowId = localAdressList[i].Id; int rowSourceKey = localAdressList[i].SourceKey; var isCheck = serverAdressList.Find(x => x.Id == rowId && x.SourceKey == rowSourceKey); if (isCheck != null) { //Bende de var serverda da varmış //Birde güncel mi diye bakalım. //model içerisindeki kolonları dönelim foreach (var prop in localAdressList[i].GetType().GetProperties()) { //Bizim modelde örnek vermek için Id ve SourceKey harici 1 tane Value kolonu var. Bunu 100 tane de olabilir. Generic olarak dönmek en mantıklısı var localPropertyName = prop.Name; var localPropertyValue = prop.GetValue(localAdressList[i], null); //O kayda ait, property value değerini bulalım var serverPropertyValue = serverAdressList.Find(x => x.Id == rowId && x.SourceKey == rowSourceKey).GetType().GetProperty(localPropertyName).GetValue(serverAdressList.Find(x => x.Id == rowId && x.SourceKey == rowSourceKey), null); if (localPropertyValue.ToString() != serverPropertyValue.ToString()) //Kolonlar arasındaki farklılıklar varmış { //Bu property local ve sunucuda eşleşmiyor. Sunucudaki column değerni kendimize set edelim! localAdressList[i].GetType().GetProperty(localPropertyName).SetValue(localAdressList[i], Convert.ChangeType(serverPropertyValue, localAdressList[i].GetType().GetProperty(localPropertyName).PropertyType), null); } } } else { //Bende varmış serverda yok, bendende silelim. IndexId'ler karışmasın diye model içerisindeki IsDelete'e set edelim for bitişinde silicez. localAdressList[i].IsDelete = true; } } //Silelim localAdressList.RemoveAll(x => x.IsDelete); //Bende olmayıp, serverda olan kayıtlar varmış ona da bakalım! if (localAdressList.Count() < serverAdressList.Count()) { for (int i = 0; i < serverAdressList.Count; i++) { //Bizde varmı bakalım if (localAdressList.Find(x => x.Id == serverAdressList[i].Id && x.SourceKey == serverAdressList[i].SourceKey) == null) { //localde yok serverda varmış, local'e set edelim! localAdressList.Add(serverAdressList[i]); } } } }
saybirs tarafından 27/May/19 15:51 tarihinde düzenlenmiştir