Listedeki IN (A, B, C) öğelerinin bulunduğu linq seçme nesneleri


170

Bir listem var orders. Bir dizi sipariş durumuna göre
seçmek istiyorum orders.

Aslında select orders where order.StatusCode in ("A", "B", "C")

// Filter the orders based on the order status
var filteredOrders = from order in orders.Order
                     where order.StatusCode.????????("A", "B", "C")
                     select order;

Bu kadar çabuk cevaplanan herkese teşekkürler. Lambda çözeltisi için Esp. Henüz lambda ifadeleriyle hiçbir şey yapmadım. Ben (o =>! (Statuses.Contains (o.OrderHeaderOrderStatusCode)) kullanarak bir NOT yapmak istiyorum varsayalım
MartinS

Yanıtlar:


289

Durum kodlarınız da bir koleksiyon olduğundan, şunu kullanın Contains:

var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));

veya sorgu sözdiziminde:

var filteredOrders = from order in orders.Order
                     where allowedStatus.Contains(order.StatusCode)
                     select order;

1
HashSet izin verilen dizi yerine HashSet kullanın söyleyebilirim çünkü HashSet içeren yöntemi en hızlı ve 1000'den fazla öğe içeriyorsa dizi ile performans sorunları olacaktır. var allowedStatus = yeni HashSet <dizgi> {"A", "B", "C"};
Jay Shah

15
var statuses = new[] { "A", "B", "C" };

var filteredOrders = from order in orders.Order
                             where statuses.Contains(order.StatusCode)
                             select order;

15

Not: Bu nesnelere LINQ, varlıklara LINQ çalışıp çalışmadığından% 100 emin değilim ve şu anda kontrol etmek için zamanım yok. Aslında [A, B, C] ' de x'e çevirmek çok zor değil , ama kendiniz kontrol etmeniz gerekiyor.

Yani, yerine İçeren bir yedek olarak ???? kodunuzda daha fazla LINQ-uish olan herhangi birini kullanabilirsiniz :

// Filter the orders based on the order status
var filteredOrders = from order in orders.Order
                     where new[] { "A", "B", "C" }.Any(s => s == order.StatusCode)
                     select order;

SQL'den bildiklerinizin tam tersi bu yüzden bu kadar açık değil.

Elbette, akıcı sözdizimini tercih ediyorsanız:

var filteredOrders = orders.Order.Where(order => new[] {"A", "B", "C"}.Any(s => s == order.StatusCode));

Burada yine LINQ sürprizlerinden birini görüyoruz (Joda-konuşma gibi sonunda seçiyor). Ancak bu anlamda oldukça mantıklı olduğunu da denetler öğelerden en az biri (yani eğer herhangi bir listede) (set, koleksiyon) tek değeriyle eşleşir.


12

ContainsFonksiyonu ile deneyin ;

Bir dizinin belirtilen bir öğe içerip içermediğini belirler.

var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));

-3

Sadece dikkatli olun, .Contains()beklemediğiniz dize de dahil olmak üzere herhangi bir alt dize ile eşleşecektir. Örneğin. new[] { "A", "B", "AA" }.Contains("A")size istemeyeceğiniz A ve AA'yı döndürecektir. Onun tarafından ısırıldım.

.Any()ya .Exists()da daha güvenli bir seçim


yeni [] {"B", "AA"}. içerir ("A") yanlış, DOĞRU döndürmez.
Jay Shah
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.