2009-09-22 16 views
6

मेरे पास लगभग 1000 ऑब्जेक्ट्स का अवलोकन करने योग्य चयन है जिसे अंतिम उपयोगकर्ता द्वारा फ़िल्टर (खोजा) की आवश्यकता है। उपयोगकर्ता नाम या कर्मचारी आईडी द्वारा खोज करने में सक्षम होना चाहिए। सूची नियंत्रण फ़िल्टर किए गए कर्मचारियों का उपभोग करता है और कर्मचारियों को पृष्ठ लोड पर सब कुछ के साथ लोड किया जाता है।उपयोगकर्ता इनपुट द्वारा एक पर्यवेक्षण चयन को फ़िल्टर करना

मैं वर्तमान में यह इस तरह के रूप में स्थापित किया है:

public ObservableCollection<EmployeeServicesData> Employees { get; set; } 
public ObservableCollection<EmployeeServicesData> FilteredEmployees { get; set; } 

internal void FilterEmployee(string searchText, bool isByName) 
{ 
    if (searchText.Length > 0) 
    { 
     IEnumerabe<EmployeeServicesData> filter; 

     if (isByName) 
      filter = Employees.Where(x => x.Name.Length >= searchText.Length).Where(x => x.Name.Substring(0, searchText.Length) == searchText.ToUpper()); 
     else 
      filter = Employees.Where(x => x.EmployeeNumber.ToString().Length > searchText.Length).Where(x => x.EmployeeNumber.ToString().Substring(0, searchText.Length) == text); 

     foreach (EmployeeServicesData employee in filter) 
      FilteredEmployees.Add(employee); 
    } 
} 

स्वच्छता इस विधि से पहले नियंत्रित किया जाता है।

यह बहुत प्रभावशाली गंध नहीं करता है। क्या मुझे इसके लिए दो तरीकों का उपयोग करना चाहिए, या फ़िल्टरिंग को संभालने का एक बेहतर तरीका है?

मैं कर्मचारियों को एक अपरिवर्तित स्थिति में रखना चाहता हूं ताकि मैं फिर से डीबी को मारने के बिना फ़िल्टर किए गए कर्मचारियों को पूरी सूची में दोबारा बदल सकूं।

+0

किस प्रकार अपनी सूची नियंत्रण है? यह साफ होगा अगर यह फ़िल्टर करने वाले कर्मचारियों को उनकी प्रतिलिपि बनाने के बजाय सीधे उपभोग कर सकता है, लेकिन केवल 1000 के साथ यह शायद कोई फर्क नहीं पड़ता। –

+0

FilteredEmployees – Slipfish

उत्तर

1

ऐसा लगता है कि आप यह देखने की कोशिश कर रहे हैं कि खोज टेक्स्ट कर्मचारी नाम में या कर्मचारी संख्या में निहित है या नहीं।

आप इस के बजाय कर सकता है:

x.Name.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0 
x.EmployeeNumber.ToString().IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0 

या आप StartsWith बजाय indexOf इस्तेमाल कर सकते हैं।

संपादित करें: उनमें बड़ी मात्रा में डेटा के साथ सूची नियंत्रण के साथ एक और समस्या यह है कि इसे प्रस्तुत करने में लंबा समय लगता है। इसलिए यदि आप शुरू करते हैं और सिल्वरलाइट या डब्ल्यूसीएफ या जो कुछ भी 1000 को नियंत्रण में प्रस्तुत करना है, तब भी आप इसे अपरिवर्तित करते हैं, भले ही आप उन सभी को नहीं देखते हैं, इसमें थोड़ा सा समय लग सकता है। सिल्वरलाइट 3 में UI Virtualization है, जो शायद सबसे अच्छा अनुकूलन होगा जो आप यहां कर सकते हैं।

+0

पर बस एक नियमित पुरानी सूची बॉक्स बाध्यकारी वर्तमान में यह एक पेजेड गेटवे से भरा जा रहा है, इसलिए वहां कोई समस्या नहीं है। – Slipfish

2

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मैं फ़िल्टरिंग पहलू के साथ मेरी मदद करने के लिए इसका उपयोग कर रहा था और देखा कि स्लीपफ़िश आईनेमेरेबल संग्रह के चारों ओर लूपिंग द्वारा ऑब्जर्जेबल कोलेक्शन बना रहा था।

FilteredEmployees = new ObservableCollection<EmployeeServicesData>(filter); 
+0

+1 – electricalbah

1

एक filtered observable संग्रह के लिए इस पोस्ट पर एक नज़र डालें:

ObservableCollection निर्माता के रूप में एक IEnumerable संग्रह ObservableCollection इस तरह बनाया जा सकता है स्वीकार करता है।

+0

जानने के लिए बहुत उपयोगी है इस कोड को एक कोशिश करें, ठीक वही जो मैं खोज रहा था, इसे इंगित करने के लिए धन्यवाद! –

संबंधित मुद्दे