Linq सूची में उन वस्तुओं का चयन करता है जहाँ IN (A, B, C) मौजूद हैं


169

मैं की एक सूची है orders
मैं ordersऑर्डर स्थिति के सेट के आधार पर चयन करना चाहता हूं ।

तो अनिवार्य रूप से 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;

सभी को धन्यवाद कि इतनी जल्दी जवाब दिया। लैम्ब्डा समाधान के लिए Esp। मैंने अभी तक लंबोदर भाव के साथ कुछ नहीं किया है। मुझे लगता है कि मैं ऐसा नहीं करूँगा (o =>! (Statuses.Contains (o.OrderHeaderOrderStatusCode)))
मार्टिन 12:10 12:13

जवाबों:


288

आपके स्टेटस-कोड भी एक संग्रह हैं, इसलिए उपयोग करें Contains:

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

या क्वेरी सिंटैक्स में:

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

1
मैं कहूंगा कि अनुमतस्ट्रैटस के लिए सरणी के बजाय हैशसेट का उपयोग करें क्योंकि हैशसेट की विधि सबसे तेज़ है और 1000 से अधिक आइटम होने पर सरणी के साथ प्रदर्शन के मुद्दे होंगे। var allowStatus = new HashSet <string> {"A", "B", "C"};
जय शाह

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

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

15

NB: यह LINQ ऑब्जेक्ट्स के लिए है, अगर मैं LINQ में काम करता हूं तो यह 100% निश्चित नहीं है, और अभी इसकी जांच करने का कोई समय नहीं है। वास्तव में इसे [ए, बी, सी] में एक्स में अनुवाद करना बहुत मुश्किल नहीं है , लेकिन आपको अपने लिए जांच करनी होगी।

तो, बजाय शामिल की एक स्थानापन्न के रूप ???? अपने कोड में आप किसी का उपयोग कर सकते हैं जो अधिक LINQ-uish है:

// 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;

यह एसक्यूएल से जो आप जानते हैं उसके विपरीत है यही कारण है कि यह इतना स्पष्ट नहीं है।

यदि आप धाराप्रवाह वाक्य रचना पसंद करते हैं, तो यह है:

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

यहाँ हम फिर से एक LINQ सरप्राइज देखते हैं (जैसे जोडा-भाषण जो अंत में सेलेक्ट करता है)। हालाँकि यह इस अर्थ में काफी तर्कसंगत है कि यह जाँचता है कि किसी सूची (सेट, संग्रह) में से कम से कम एक आइटम एक मूल्य से मेल खाता है या नहीं।


12

Containsफ़ंक्शन के साथ प्रयास करें ;

निर्धारित करता है कि किसी अनुक्रम में एक निर्दिष्ट तत्व है या नहीं।

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

-3

बस सावधान रहें, .Contains()उस स्ट्रिंग सहित किसी भी विकल्प से मेल खाएगा जिसकी आपको उम्मीद नहीं है। उदाहरण के लिए। new[] { "A", "B", "AA" }.Contains("A")आप ए और एए दोनों को वापस कर देंगे जो आप नहीं चाहते हैं। मुझे इससे काट दिया गया है।

.Any()या .Exists()सुरक्षित विकल्प है


नया [] {"बी", "एए"}। काम करता है ("ए") गलत, सच नहीं लौटेगा।
जय शाह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.