मान लीजिए मेरे पास एक List<string> है, जहां प्रत्येक स्ट्रिंग समान लंबाई की है। यह लंबाई पहले से ज्ञात नहीं है, और केवल रन टाइम पर स्ट्रिंग की लंबाई संपत्ति (पहले वाला कहें, क्योंकि वे सभी समान लंबाई हैं) की जांच करके निर्धारित की जा सकती हैं।

मैं जो चाहता हूं वह अज्ञात वस्तुओं के संग्रह के साथ समाप्त होना है, जिनमें से प्रत्येक में गुण सी 1, सी 2, आदि है, प्रत्येक चरित्र के लिए एक।

इसलिए, यदि सूची में पहली स्ट्रिंग "abcd" थी, तो परिणामी सूची में पहली अनाम वस्तु होगी ...

{
  C1 = "a",
  C2 = "b",
  C3 = "c",
  C4 = "d"
}

क्या यह संभव है? मैं गतिशीलता और ExpandoObjects के साथ संघर्ष कर रहा हूं, लेकिन उनमें से किसी को भी काम करने में कामयाब नहीं हुआ है। ऐसा लगता है कि मुख्य समस्या संपत्ति के नाम पहले से नहीं जानना है।

मैंने चीजों को करने की कोशिश की (लूप में) ...

d["C" + i] = str.[j];

... लेकिन यह काम नहीं करता क्योंकि यह सोचता है कि मैं सरणी अनुक्रमण का उपयोग करने की कोशिश कर रहा हूं। मुझे "System.Dynamic.ExpandoObject' प्रकार की अभिव्यक्ति के लिए [] के साथ अनुक्रमण लागू नहीं कर सकता" का रन-टाइम अपवाद मिलता है।

क्या यह किया जा सकता है?

0
Avrohom Yisroel 17 जुलाई 2017, 18:39
3
मुझे आश्चर्य है कि आप ऐसी वस्तुओं का उपभोग कैसे करेंगे? और "अब्बा" स्ट्रिंग के बारे में क्या?
 – 
Sergey Berezovskiy
17 जुलाई 2017, 18:41
उपभोग कोई मुद्दा नहीं है, क्योंकि इसे एक डब्ल्यूपीएफ ग्रिड को पास किया जाना है जो गुणों को उन स्तंभों से जोड़ देगा जिन्हें हम फ्लाई पर जोड़ते हैं। डुप्लिकेट वर्ण कोई समस्या नहीं हैं, क्योंकि स्ट्रिंग में वर्णों का क्रम महत्वपूर्ण है। ऐसा नहीं लगता था कि बिट प्रासंगिक था, इसलिए प्रश्न में इसका उल्लेख नहीं किया
 – 
Avrohom Yisroel
17 जुलाई 2017, 18:42
1
@AvrohomYisroel: हो सकता है कि आप TypeBuilder उपयोगिता पर एक नज़र डालें: msdn.microsoft.com/en-us/library/… इसके साथ, आप इनपुट पर पुनरावृति कर सकते हैं और मैप किए गए गुण उत्पन्न कर सकते हैं और मान निर्दिष्ट कर सकते हैं। Expando के संबंध में, यदि आप इसे पहले किसी शब्दकोश में डालते हैं, तो आप एक अनुक्रमणिका की तरह इसमें गुण/डेटा सम्मिलित करने में सक्षम हो सकते हैं: stackoverflow.com/ a/26778625/1269654 संपादित करें: शायद विस्तार के लिए थोड़ा बेहतर उत्तर: stackoverflow.com/a/10048479/1269654 ए>
 – 
Chris Sinclair
17 जुलाई 2017, 18:46
सलाह के लिये धन्यवाद। मैंने ExpandoObject को Dictionary पर कास्ट करने पर ध्यान दिया, लेकिन समस्या यह है कि मुझे नहीं पता कि object के साथ क्या करना है क्योंकि मैं केवल रन टाइम पर गुणों की संख्या जानता हूं। मैं TypeBuilder पर एक नज़र डालूंगा
 – 
Avrohom Yisroel
17 जुलाई 2017, 18:48
1
@AvrohomYisroel: क्या यह आपके नमूना कोड के समान नहीं होगा? for(int i = 1; i <= myString.Length; i++) ((IDictionary<string, object>)d)["C" + i] = myString[i - 1];
 – 
Chris Sinclair
17 जुलाई 2017, 18:51

1 उत्तर

सबसे बढ़िया उत्तर

आप ExpandoObject को एक शब्दकोश के रूप में संपत्ति के नाम के साथ कुंजी के रूप में और मूल्यों को संपत्ति मान के रूप में मान सकते हैं। इस सरल विस्तार विधि से आप एक ExpandoObject बना सकते हैं और इसे स्रोत स्ट्रिंग से उत्पन्न गुणों से भर सकते हैं:

public static ExpandoObject ToExpando(this string s)
{
    var obj = new ExpandoObject();
    var dictionary = obj as IDictionary<string, object>;       
    var properties = s.Distinct().Select((ch, i) => new { Name = $"C{i+1}", Value = ch });

    foreach (var property in properties)
        dictionary.Add(property.Name, property.Value);

    return obj;
}

उपयोग:

var source = new List<string> { "bob", "john" };
var result = source.Select(s => s.ToExpando());

आउटपुट:

[
  {
    "C1": "b",
    "C2": "o"
    // NOTE: If C3 = "b" is required here, than remove Distinct() in extension method
  },
  {
    "C1": "j",
    "C2": "o",
    "C3": "h",
    "C4": "n"
  }
]
4
Sergey Berezovskiy 17 जुलाई 2017, 18:55
1
मुझे लगता है कि Distinct() शायद ओपी के इरादे का हिस्सा नहीं है। जैसा कि आपने उल्लेख किया है, "अब्बा" बस इस पर मैप कर सकता है: C1=a, C2=b, C3=b, C4=a और मुझे नहीं लगता कि इससे कोई समस्या होगी। संपादित करें: अन्यथा, मुझे लगता है कि यह अनुरोध को पूरा करता है।
 – 
Chris Sinclair
17 जुलाई 2017, 18:55
हां, यदि डुप्लीकेट मान ठीक हैं, तो Disctinct() को यहां से हटा देना चाहिए। शायद मुझे मेरी टिप्पणी का ओपी उत्तर सही ढंग से नहीं मिला
 – 
Sergey Berezovskiy
17 जुलाई 2017, 18:58
मैंने सोचा कि मैंने वास्तव में इसका उत्तर दिया था, मैंने कहा कि पात्रों का क्रम महत्वपूर्ण है, इसलिए मुझे पता है कि पहला चार क्या दर्शाता है, और परवाह नहीं है कि यह एक ही चार के रूप में एक अलग स्थिति में होता है। किसी भी तरह से, आपका कोड बहुत अच्छा लग रहा है धन्यवाद। मैं बस इसके साथ खेल रहा हूं, जैसा कि मुझे लगता है कि मैं वास्तव में ExpandoObject को छोड़ सकता हूं और सीधे प्रकार की वस्तुओं से निपट सकता हूं Dictionary<String, dynamic>
 – 
Avrohom Yisroel
17 जुलाई 2017, 19:04
1
जैसा कि मैंने सोचा, इसे सरल बनाया जा सकता है। आप बस एक Dictionary<String, dynamic> बना सकते हैं और उसमें गुण जोड़ सकते हैं। किसी ExpandoObject की बिल्कुल भी आवश्यकता नहीं है। एक बार फिर धन्यवाद
 – 
Avrohom Yisroel
17 जुलाई 2017, 19:10