2011-12-16 11 views
5

मेरे पास दो सूची हैं जिन्हें मैं इंडेक्स द्वारा एक्सेस कर रहा हूं (उदा। Name[10], Date[10])। वे बारीकी से बंधे हैं, इसलिए Name[10]Date[10] से संबंधित है और इसके विपरीत।एक साथ दो सूचियों <T> क्रमबद्ध करें?

इस डिजाइन ने अच्छी तरह से काम किया है लेकिन अब मुझे उन्हें सॉर्ट करने की आवश्यकता है। मैं उन्हें अलग-अलग दोनों को सॉर्ट कर सकता हूं लेकिन जाहिर है कि दोनों सूचियों के बीच संबंध हटा देगा और उन्हें बेकार बना देगा।

मैंने इसके बजाय Dictionary<string, DateTime> का उपयोग करने के बारे में सोचा लेकिन ऐसा लगता है कि मैं केवल उस कुंजी तक पहुंच सकता हूं (जो भी अनावश्यक है)। अनिवार्य रूप से मुझे तीन चीजों, दो मानों और एक अनुक्रमणिका की आवश्यकता है जिसे मैं संख्यात्मक रूप से पुन: सक्रिय कर सकता हूं (foreach नहीं)।

क्या कोई मदद कर सकता है? ऐसा लगता है मैं या तो डेटा संरचना बदलने के लिए या दो अलग List<T> एक साथ सॉर्ट करने के लिए कैसे बाहर काम करने की जरूरत है ...

public class Results 
{ 
public List<string> Name { get; set; } 
public List<DateTime> Date{ get; set; } 
} 

for (int x = 0; x < results; x++) 
{ z.N = results.Name[X]; z.D = results.Date[x]; } 

उत्तर

9

ऐसा लगता है कि आप स्पष्ट समाधान है जो एक छोटे से की बिट शामिल कर के खिलाफ लड़ रहे हैं अपफ्रंट वर्क: नाम/दिनांक जोड़ी को समाहित करने के लिए एक प्रकार बनाना।

यह बिल्कुल आपको क्या करना चाहिए। फिर आपके पास एक सूची हो सकती है, इसे नाम या तिथि या जो कुछ भी आप चाहते हैं उसे सॉर्ट करें, और आपको सिंक से बाहर होने वाली दो सूचियों के बारे में चिंता करने की आवश्यकता नहीं है।

यदि आपकी Results कक्षा कुछ भी नहीं करती है उन दो सूचियों को शामिल करें, आप वास्तव में उसी प्रकार के प्रकार के साथ समाप्त हो सकते हैं - के पक्ष में, के नाम पर का नाम और दिनांक हो सकता है।

+0

वह सामान्य शब्दकोश – AMH

+3

@AMH का उपयोग कर सकते हैं: ओ पी पहले से ही माना जाता है कि - यह क्रम बनाए रखने के नहीं है, और यह मूल रूप है * * क्या वह दुकान की कोशिश कर रही है। वह एक सूची चाहता है, लेकिन दो अलग-अलग मूल्यों के लिए। –

+1

एक अतिरिक्त लाभ के रूप में, यह समाधान आपको जो भी अवधारणा का प्रतिनिधित्व करने की कोशिश कर रहा है, उसे स्पष्ट नाम देने की अनुमति देगा, और इसके अतिरिक्त आप इस डेटा को उसी प्रकार के भीतर जोड़कर तर्क एम्बेड कर सकते हैं, इसके बजाय यह संभवतः चारों तरफ खींचा जा सकता है आपका कोड कहीं और। –

2

खुद पर एक एहसान करो और दो बातें एक साथ रखें:

public class NameAndDate { 
    public string Name { get; set; } 
    public DateTime Date { get; set; } 
} 

तो फिर तुम उन्हें एक सूची (List<NameAndDate>) में रखें:

आप नाम से सॉर्ट करने के लिए चाहते हैं, एक IComparer कार्यान्वयन जोड़ने NameAndDate पर, तो आप सूची में केवल Sort() पर कॉल कर सकते हैं।

आप, नाम और दिनांक के लिए उपयोग रखने के परिणामों पर एक्सेसर तरीकों जोड़ने जैसे

public string GetName(int index) { 
    return list[i].Name; 
} 
1

चाहते हैं आप एक मूल्य धारण करने के लिए एक कस्टम प्रकार बना सकते हैं, या आप केवल इसका इस्तेमाल करने की जरूरत है एक विधि के दायरे में आप निम्न प्रकार के अनाम प्रकार का उपयोग कर सकते हैं।

var namesAndDates = MyNames 
    .Select((name, i) => new {name, date = MyDates[i]}); 

यहां से दो मान अब ढीले बंधे नहीं हैं। अब आप उन्हें सॉर्ट कर सकते हैं।

var sortedNamesAndDates = namesAndDates.OrderBy(a => a.date); 

या जो कुछ भी आपको उनके साथ करना होगा।

0

आप कुंजी का नाम के साथ शब्दकोश, और मूल्य तिथि

उपयोग कर सकते हैं यू कर सकते हैं उस तरह के बाद उन्हें आसानी से

2
List<Tuple<string,DateTime> NameDateList {get; set; } 

एक आसान तरीका पूरा करने के लिए आप क्या चाहते है, लेकिन स्पष्टता के लिए आप शायद कर रहे हैं

public class NameDate 
{ 
    public string Name { get; set; } 
    public DateTime Date{ get; set; } 
} 

तो फिर तुम इस्तेमाल कर सकते हैं:

इस तरह के रूप में उन्हें घर में एक कस्टम प्रकार बनाने से बेहतर
List<NameDate> NameDateList {get; set; } 
1

दो गुण

public class Result 
{ 
    public string Name {set;get;} 
    public DateTime Date { set;get;} 
} 

अब के साथ एक वर्ग "परिणाम" कहा जाता बनाएं तो आप इस वर्ग

List<Result> objListResult=new List<Result>(); 
अब आपके मामले में

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

for(int i=0;i<Name.Count;i++) 
{ 
    objListResult.Add(new Result { Name =Name[i].ToString(), Date[i].ToString() }); 
} 

आप इस

objListResult[2].Date 

जैसे नए सूची से आइटम प्राप्त कर सकते हैं दे देंगे सूची में दूसरी वस्तु के लिए संग्रहीत दिनांक

objListResult[2].Name 

आप का नाम सूची

+0

इस सोने को एक बार भी ऊपर नहीं उठाया गया है ... –

6

उपयोग Array.Sort अधिभार कि चाबियों का एक सरणी और मूल्यों की एक सरणी लेता में दूसरी वस्तु के लिए संग्रहित दे देंगे, यह ठीक है कि तुम क्या करना चाहती है। (इस विधि .NET 2.0 बाद से उपलब्ध है।)

+2

प्रश्न के उत्तर देने के लिए धन्यवाद। अन्य उत्तरों की तरह एक साथ नाम और तिथि जोड़ना आम तौर पर अच्छी सलाह है, लेकिन ऐसी स्थितियां हैं जहां दो सममित सरणी संग्रहीत होती है। विशेष रूप से, एक कम्प्यूटेशनल गहन एल्गोरिदम में 'Arrays का संरचना' डेटा लेआउट का उपयोग करके। –

+1

बिल्कुल सही। ठीक वही जो मेरे द्वारा खोजा जा रहा था। मुझे नहीं पता था कि यह सुविधा मौजूद थी। – Timo

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