मैं 30 000 लाइनों के साथ csv फ़ाइल है। मुझे कई स्थितियों के आधार पर कई मूल्यों का चयन करना है, इसलिए कई लूपों और "अगर है" के लिए मैंने linq का उपयोग करने का निर्णय लिया है। मैंने सीएसवी पढ़ने के लिए कक्षा लिखी है। यह linq के साथ उपयोग करने के लिए IENumerable लागू करता है। यह मेरा गणक है:LINQ में खोज विधि को बदलना संभव है?
class CSVEnumerator : IEnumerator
{
private CSVReader _csv;
private int _index;
public CSVEnumerator(CSVReader csv)
{
_csv = csv;
_index = -1;
}
public void Reset(){_index = -1;}
public object Current
{
get
{
return new CSVRow(_index,_csv);
}
}
public bool MoveNext()
{
return ++_index < _csv.TotalRows;
}
}
यह काम कर रहा है, लेकिन यह धीमा है। मान लीजिए कि मैं कॉलम ए में अधिकतम मूल्य 100 रेंज में चुनना चाहता हूं; 150 पंक्ति।
max = (from CSVRow r in csv where r.ID > 100 && r.ID < 150 select r).Max(y=>y["A"]);
यह काम करेंगे, लेकिन 30 000 के बजाय 48. पंक्तियों जैसा कि मैंने कहा, मैं पाश इस्तेमाल कर सकते हैं, लेकिन केवल इस उदाहरण मामले में, की स्थिति "क्रूर" कर रहे हैं में अधिकतम मूल्य के लिए LINQ खोजें :)
वहाँ LINQ संग्रह खोज ओवरराइड करने के लिए कोई तरीका है। कुछ ऐसा: मेरे गणक पर उपयोग की गई क्वेरी में देखें, देखो, "जहां" में "lin" में कोई भी लिनक्स स्थितियां "पंक्ति आईडी फ़िल्टर" है और इस पर आधारित एक और डेटा दें।
मैं एक सरणी/संग्रह करने के लिए डेटा का हिस्सा कॉपी नहीं करना चाहते हैं और समस्या मेरी सीएसवी रीडर में नहीं है। आईडी द्वारा प्रत्येक पंक्ति तक पहुंच तेजी से होती है, केवल समस्या तब होती है जब आप उनमें से सभी 30 000 तक पहुंचते हैं। किसी भी मदद की सराहना की :-)
BTW है, तो मैं भी ऐसा ही किया।), आप को लागू करना चाहिए 'IEnumerable'। –
SLaks
यह कैसे कार्यान्वित किया जाता है -> 'नया सीएसवीआरओ (_index, _csv) '। यादृच्छिक पहुंच या अनुक्रमिक पहुंच? – Tilak
क्या आप सुनिश्चित हैं कि ऑब्जेक्ट्स के लिए linq आपके सभी रिकॉर्ड पर अधिकतम लागू होता है न केवल इन 48? अजीब, यह अनुक्रमिक रूप से ऑपरेटरों को लागू करना चाहिए। मेरा अनुमान है कि आपका गणक धीमा है। –