2009-11-19 10 views
79

मैं सी # एक्सप्रेस 2008 का उपयोग कर एक साधारण विंडोज़ फॉर्म एप्लिकेशन बना रहा हूं। मैं एक अनुभवी सी ++ डेवलपर हूं, लेकिन मैं सी # और .NET के लिए काफी नया ब्रांड हूं।एप्लिकेशन में int [] सरणी को स्टोर करने के लिए कैसे करें सेटिंग्स

मैं वर्तमान में मेरे सरल आवेदन सेटिंग्स डिजाइनर और इस तरह कोड का उपयोग कर कुछ सेटिंग्स भंडारण कर रहा हूँ:

// Store setting 
Properties.Settings.Default.TargetLocation = txtLocation.Text; 
... 
// Restore setting 
txtLocation.Text = Properties.Settings.Default.TargetLocation; 

अब मैं या तो ints की एक सरणी (int[]) संग्रह करना चाहते हैं, या संभवतः एक एक सेटिंग के रूप में इनट्स की सूची (List<int>)। हालांकि, मैं यह नहीं समझ सकता कि यह कैसे करें। मैंने प्रलेखन, स्टैक ओवरफ्लो और Google की खोज की है, और मुझे यह कैसे करना है इसके बारे में एक सभ्य स्पष्टीकरण नहीं मिल रहा है।

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

आपकी मदद के लिए अग्रिम धन्यवाद!

+7

मैं भी ब्रांड के नए stackoverflow करने के लिए (जो btw मीठा होता है) हूँ, इसलिए कृपया कोई अगर मैं ज्वलंत किसी भी नियम या दिशानिर्देशों को तोड़ दिया है। :-) – sidewinderguy

+3

आपका स्वागत है! हम यहां मदद करने के लिए हैं (और यदि आप चाहें तो भी कर सकते हैं) – Abel

+1

+1 एक नौसिखिया होने के लिए;) –

उत्तर

118

एक और समाधान भी है - सेटिंग फ़ाइल के मैन्युअल संपादन की आवश्यकता है, लेकिन बाद में वीएस पर्यावरण और कोड में ठीक काम करता है। और कोई अतिरिक्त फ़ंक्शन या रैपर की आवश्यकता नहीं है।

बात यह है कि वीएस सेटिंग्स फ़ाइल में डिफ़ॉल्ट रूप से int[] प्रकार क्रमबद्ध करने की अनुमति देता है - यह आपको डिफ़ॉल्ट रूप से इसे चुनने की अनुमति नहीं देता है। तो, वांछित नाम (जैसे कुछ टेस्टसेटिंग) के साथ एक सेटिंग बनाएं और इसे किसी भी प्रकार से बनाएं (उदा। string डिफ़ॉल्ट रूप से)। परिवर्तनों को सहेजें।

अब अपने प्रोजेक्ट फ़ोल्डर पर जाएं और टेक्स्ट एडिटर (नोटपैड, उदाहरण के लिए) के साथ "गुण \ सेटिंग्स.सेटिंग" फ़ाइल खोलें या आप इसे सॉल्यूशन एक्सप्लोरर में राइट-क्लिक करके वीएस में खोल सकते हैं "-> Properties - > सेटिंग्स.सेटिंग "," इसके साथ खोलें ... "चुनें और फिर" एक्सएमएल संपादक "या" स्रोत कोड (टेक्स्ट) संपादक "चुनें। खोला एक्सएमएल सेटिंग्स में अपनी सेटिंग को खोजने (यह इस तरह दिखेगा):

<Setting Name="SomeTestSetting" Type="System.String" Scope="User"> 
    <Value Profile="(Default)" /> 
</Setting> 

बदलें System.String से System.Int32[] "प्रकार" परम। अब यह खंड इस तरह दिखेगा:

<Setting Name="SomeTestSetting" Type="System.Int32[]" Scope="User"> 
    <Value Profile="(Default)" /> 
</Setting> 

अब परिवर्तनों को सहेजें और परियोजना सेटिंग्स को फिर से खोलें - voilà! - हमारे पास System.Int32[] प्रकार के साथ कुछ टेस्टसेटिंग सेटिंग है जिसे वीएस सेटिंग्स डिज़ाइनर (मान भी) के साथ-साथ कोड में भी एक्सेस और संपादित किया जा सकता है।

+5

बहुत बढ़िया । विजुअल स्टूडियो में संपादक का उपयोग करके सेटिंग में कुछ दर्ज करने के लिए, आपको इस तरह कुछ पेस्ट करना चाहिए, यह एक स्ट्रिंग सरणी के लिए है, जो मुझे चाहिए sTRING1 string2 Karsten

+9

+1 .. समझ में नहीं आता कि यह क्यों स्वीकार नहीं किया गया था .. कोई अतिरिक्त कोड आवश्यक नहीं है (केवल मौजूदा एक्सएमएल की एक पंक्ति संशोधित करें) और आपको टाइप सुरक्षा और पूर्ण बनाम डिजाइनर समर्थन मिलता है! – Chris

+1

क्रिस, धन्यवाद :) बात यह है कि, मैंने अपना उत्तर बहुत बाद में मूल रूप से स्वीकृत उत्तर (लगभग एक साल बाद, वास्तव में :)) जोड़ा है। बस अनुभव साझा करना :) –

38

स्टोर करने के लिए:

string value = String.Join(",", intArray.Select(i => i.ToString()).ToArray());

को फिर से बनाने:

int[] arr = value.Split(',').Select(s => Int32.Parse(s)).ToArray();

संपादित करें: हाबिल सुझाव!

+2

और मुझे ;-)। युक्ति "आप 'ToCharArray()' को हटा सकते हैं, और 'value.Split (', ')' का उपयोग कर सकते हैं, जो एक टैड अधिक पठनीय है। – Abel

+0

ठीक है, तो ऐसा लगता है कि आप मैन्युअल रूप से स्ट्रिंग में डेटा को क्रमबद्ध कर रहे हैं, और उपाध्यक्ष -वर्स। मुझे लगता है कि यह काम करेगा, मैं बस एक स्ट्रिंग सेटिंग के रूप में डेटा स्टोर कर सकता था। मैंने ऐसा कुछ करने का सोचा, लेकिन मैं कुछ और "साफ" या "मानक" या बस .NET'ish की तलाश में था। मैं इसे ध्यान में रखूंगा, हालांकि, अगर कुछ भी बेहतर नहीं होता है तो धन्यवाद। – sidewinderguy

+0

हाय, मैं मैके के एवेन्यू के साथ जाऊंगा! (कॉन्फ़िगरेशन सेक्शन/सेक्शन ग्रुप) –

0

मुझे लगता है कि आप अपनी सेटिंग्स को क्रमबद्ध करने के बारे में सही हैं। एक नमूने के लिए इस सवाल का मेरा उत्तर देखें:

Techniques for sharing a config between two apps?

तो आप प्रॉपर्टी जो एक सरणी है, इस तरह होगा:

/// <summary> 
/// Gets or sets the height. 
/// </summary> 
/// <value>The height.</value> 
[XmlAttribute] 
public int [] Numbers { get; set; } 
3

एक System.Collections.ArrayList के रूप में स्थापित करने का उल्लेख करें और फिर:

Settings.Default.IntArray = new ArrayList(new int[] { 1, 2 }); 

int[] array = (int[])Settings.Default.IntArray.ToArray(typeof(int)); 
9

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

List<int> array = Settings.Default.Testing; 
array.Add(new Random().Next(10000)); 
Settings.Default.Testing = array; 
Settings.Default.Save(); 

इस लक्ष्य को हासिल करने के लिए आप एक प्रकार कनवर्टर है कि करने के लिए और तार से रूपांतरण की अनुमति देता है के साथ एक प्रकार की जरूरत है।

[TypeConverter(typeof(MyNumberArrayConverter))] 
public class MyNumberArray ... 

फिर TypeConverter की व्युत्पत्ति के रूप में इस प्रकार कनवर्टर को लागू करने:

class MyNumberArrayConverter : TypeConverter 
{ 
    public override bool CanConvertTo(ITypeDescriptorContext ctx, Type type) 
    { return (type == typeof(string)); } 

    public override bool CanConvertFrom(ITypeDescriptorContext ctx, Type type) 
    { return (type == typeof(string)); } 

    public override object ConvertTo(ITypeDescriptorContext ctx, CultureInfo ci, object value, Type type) 
    { 
     MyNumberArray arr = value as MyNumberArray; 
     StringBuilder sb = new StringBuilder(); 
     foreach (int i in arr) 
      sb.Append(i).Append(','); 
     return sb.ToString(0, Math.Max(0, sb.Length - 1)); 
    } 

    public override object ConvertFrom(ITypeDescriptorContext ctx, CultureInfo ci, object data) 
    { 
     List<int> arr = new List<int>(); 
     if (data != null) 
     { 
      foreach (string txt in data.ToString().Split(',')) 
       arr.Add(int.Parse(txt)); 
     } 
     return new MyNumberArray(arr); 
    } 
} 

MyNumberArray वर्ग हम तो सुरक्षित रूप से प्रदान कर सकते हैं पर कुछ सुविधा तरीकों की जानकारी देकर आप TypeConverterAttribute साथ प्रकार सजाने कर ऐसा करते हैं सूची से और पूरी तरह से:

[TypeConverter(typeof(MyNumberArrayConverter))] 
public class MyNumberArray : IEnumerable<int> 
{ 
    List<int> _values; 

    public MyNumberArray() { _values = new List<int>(); } 
    public MyNumberArray(IEnumerable<int> values) { _values = new List<int>(values); } 

    public static implicit operator List<int>(MyNumberArray arr) 
    { return new List<int>(arr._values); } 
    public static implicit operator MyNumberArray(List<int> values) 
    { return new MyNumberArray(values); } 

    public IEnumerator<int> GetEnumerator() 
    { return _values.GetEnumerator(); } 
    IEnumerator IEnumerable.GetEnumerator() 
    { return ((IEnumerable)_values).GetEnumerator(); } 
} 

आखिरकार, उन सेटिंग्स में इसका उपयोग करने के लिए जो आप उपर्युक्त कक्षाओं को जोड़ते हैं असेंबली और संकलन। अपने सेटिंग्स.सेटिंग संपादक में आप बस "ब्राउज़ करें" विकल्प पर क्लिक करें और MyNumberArray क्लास का चयन करें और आप जाएं।

फिर यह बहुत अधिक कोड है; हालांकि, इसे एक सरल सरणी से अधिक जटिल प्रकार के डेटा पर लागू किया जा सकता है।

+0

धन्यवाद यह दिलचस्प लग रहा है। जब मुझे मौका मिलता है तो मैं इसे आज़माउंगा। – sidewinderguy

2

एक साधारण समाधान एक सेटिंग के डिफ़ॉल्ट मान को संपत्ति में शून्य करने के लिए सेट करना है, लेकिन कन्स्ट्रक्टर में जांच करें कि क्या संपत्ति शून्य है और यदि ऐसा है तो इसे अपने वास्तविक डिफ़ॉल्ट मान पर सेट करें। तो अगर आप ints की एक सरणी चाहता था:

public class ApplicationSettings : ApplicationSettingsBase 
{ 
    public ApplicationSettings() 
    { 
     if(this.SomeIntArray == null) 
      this.SomeIntArray = new int[] {1,2,3,4,5,6}; 
    } 

    [UserScopedSetting()] 
    [DefaultSettingValue("")] 
    public int[] SomeIntArray 
    { 
     get 
     { 
      return (int[])this["SomeIntArray"]; 
     } 
     set 
     { 
      this["SomeIntArray"] = (int[])value; 
     } 
    } 
} 

यह hacky की तरह लगता है, लेकिन इसकी स्वच्छ और निर्माता कहा जाता है से पहले के बाद से गुण अपने पिछले (या डिफ़ॉल्ट) सेटिंग्स के लिए शुरू कर रहे हैं वांछित के रूप में काम करता है।

+1

आवेदन की स्थापना फ़ाइलों के लिए डिजाइनर कोड autogenerates, और इसलिए इस तरह एक परिवर्तन किया जाएगा ओ किसी भी समय किसी भी डिजाइनर का इस्तेमाल किया, यहां तक ​​कि गलती से लिखा है। –

1

प्रयुक्त System.Object

उदाहरण:

byte[] arBytes = new byte[] { 10, 20, 30 }; 
Properties.Settings.Default.KeyObject = arBytes; 

निकालें:

arBytes = (byte[])Properties.Settings.Default.KeyObject; 
+0

मैंने सिस्टम का उपयोग करने की कोशिश की।ऑब्जेक्ट, लेकिन सेटिंग्स सत्र के बीच जारी नहीं थे। (हां यह एक रिलीज बिल्ड था, स्टैंड-अलोन इंस्टॉल, जिसे आप इसे कॉल करना चाहते हैं, मैं आईडीई का उपयोग करके डीबगिंग नहीं कर रहा था) –

0

कुछ कार्यों कि एक स्ट्रिंग में एक पूर्णांक सरणी परिवर्तित करें, लेकिन प्रत्येक के बीच की तरह "" (अंतरिक्ष) एक चरित्र डाल दिया।

तो अगर सरणी है {1,34,546,56} स्ट्रिंग होगा "1 34 645 56"

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