2010-11-22 27 views
0

Merhaba çocuklar Listesi tabanında ürün almak için nasıl bir gereksinimleri görmek ve diğeri kullanıcı sağlanan olduğu öğelerini barındıran 2 farklı Listesini 1 var. Listemde bana iletilen tüm Listeyi kontrol etmem ve kullanıcının ekleyemediği tüm öğeleri almam gerekiyor. Kontrol, öğe sınıfı tipine dayanmaktadır. Listemde döngü yapmadan ve tek tek karşılaştırmaksızın bunu yapabileceğim bir yol var mı? karşılaştırmak ve nesne türüne

DÜZENLEME: Hala henüz .net hiçbir Lambda ifadesi 2.0 kullanıyorum arada .

DÜZENLEME 2: cevap için teşekkürler. Sanırım onunla döngü halinde kaldım ama onu eskisinden çok daha iyi yapmak için güzel bir yol buldum.

+0

Her iki listenin örneklerini gönderin ve örnek kodunuz varsa, döngü ile nasıl çalışır, o zaman insanlar daha az döngü veya gizli döngü ile en iyi duruma getirmenize yardımcı olabilir (ancak hayır, listelerde döngü yapmadan tamamen yapamazsınız)). –

cevap

0

Değil Nesnelerin ve nesnelerin listesinde hangi türlerin eksik olduğunu görmek istersiniz. Bu doğru mu? Eğer öyleyse, bu durumda, sadece float için türünü içeren bir dizi neden olacaktır, bu

List<Type> types = new List<Type>() { typeof(int), typeof(double), typeof(float) }; 
List<object> objects = new List<object>() { 1, 2, 3, 2d, 4d }; 

var missingTypes = types.Except(objects.Select(obj => obj.GetType())); 

gibi bir şey aramayı olabilir. LINQ kullanarak, döngü halindesiniz ama soyutlanmış durumda.

Düzenleme: .NET 2.0'da, eksik türlerinizi almak için aşağıdaki gibi bir şey yapabilirsiniz. Hala dönüyorsun, ama çok da kötü değil. Bunu daha iyi yazabiliyor olabilirsiniz, ve 3.5 + 'da (LINQ olmasa bile) daha iyi yazabilirsin, ama başlaman gerek.

static IEnumerable<Type> GetMissingTypes(IEnumerable<Type> types, List<object> objects) 
{ 
    List<Type> existingTypes = objects.ConvertAll(delegate(object obj) { return obj.GetType(); }); 
    foreach (Type type in types) 
    { 
     if (!existingTypes.Contains(type)) 
      yield return type; 
    } 
} 

// ... 

List<Type> types = new List<Type>() { typeof(int), typeof(double), typeof(float) }; 
List<object> objects = new List<object>() { 1, 2, 3, 2d, 4d }; 
IEnumerable<Type> missingTypes = GetMissingTypes(types, objects); 
+0

Hala kullanıyorum ve henüz Lambda ifadesi kullanıyorum. Mevcut çerçevemde bunu yapabileceğim bir yol var mı? – powerbox

+0

Yardım için teşekkürler Anthony !. LINQ olmadan işlerin nasıl yapılabileceği konusunda oldukça güzel fikirlerim var. – powerbox

0

Böyle IEnumerable.Except kullanabilirsiniz: Ne soruyorsun ne tam anlamada değilim, ama sonra bir türlerinin listesi ve bir liste var düşünmek emin

requirements.Except(userProvided, 
    delegate (T req, T user) 
    { 
     req.GetType().Equals(user.GetType()); 
    }); 
+0

Bu uzantı yöntemi .NET 2.0'da bulunmamaktadır. –

0

Sıkıştırma döngüsü ne olursa olsun. Senkronize şeker ya da değil, ya kodda bir döngü ya da derleyici tarafından bir döngü.

jtdubs sadece 2.0 dışındaki bir yöntemi kullanarak, doğru yolda olduğunu. Bir koleksiyonda dolaşın ve bir diğer dilde Find örneklerine Öntanımlı olarak bir temsilci kullanın. En güzel değil ama 2.0 koleksiyon manipülasyonu ile uğraşırken oldukça tıknazdı. Neyse ne.

0

Döngüden ziyade, bir sıralama yapabilir ve sonra karşılaştırabilirsiniz. Sizden herhangi bir kod örneği olmadan, hepimiz tahmin etmeye devam edebiliriz. "Item class type" ifadenizi string olarak kullanabilir misiniz? Öyleyse bir sıralama ve karşılaştırma daha hızlı olacaktır ve siz de döngü yapmayacaksınız.

Kaç öğe liste halinde bahsediyoruz?

0

Linq için teşekkür hazırlanırken, dikkate reqs gereksinimleri ve list kullanıcı kaynaklı ürün aşağıdaki

string[] reqs = { "A", "C", "E", "Z" }; 

string[] list = { "A", "E", "Z", "C" }; 

string[] unmet = Array.FindAll(reqs, 
    delegate(string item) 
    { 
     return !Array.Exists(list, item.Equals); 
    }); 

bool all_done = unmet.Length == 0; 

. Array sınıfının, diziler ön dizisini teslim etmek için birçok statik yöntemi vardır. Onlar eksik ne söyleyecektir unmet dizisi

.NET 2.0 hayat kurtarıcı olarak bunları kullanın.

İlgili konular