অ্যাপ্লিকেশন সেটিংসে কীভাবে int [] অ্যারে সঞ্চয় করবেন


93

আমি সি # এক্সপ্রেস ২০০৮ ব্যবহার করে একটি সাধারণ উইন্ডোজ ফর্ম অ্যাপ্লিকেশন তৈরি করছি I'm আমি একজন অভিজ্ঞ সি ++ বিকাশকারী, তবে আমি সি # এবং .NET তে বেশ নতুন ব্র্যান্ড।

আমি বর্তমানে এই জাতীয় সেটিংস ডিজাইনার এবং কোড ব্যবহার করে আমার কয়েকটি সাধারণ অ্যাপ্লিকেশন সেটিংস সংরক্ষণ করছি:

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

এখন আমি একটি সেটিংস হিসাবে একটি অন্তর্নির্মিত অ্যারে ( int[]), অথবা সম্ভবত ইনটগুলির একটি তালিকা ( ) সংরক্ষণ করতে চাই List< int >। তবে এটি কীভাবে করব তা আমি বুঝতে পারি না। আমি ডকুমেন্টেশন, স্ট্যাকওভারফ্লো এবং গুগল অনুসন্ধান করেছি এবং এটি কীভাবে করা যায় তার কোনও সুনির্দিষ্ট ব্যাখ্যা খুঁজে পাচ্ছি না।

আমি খুঁজে পেয়েছি এমন বিরল উদাহরণগুলির উপর ভিত্তি করে আমার কুণ্ডলীটি হ'ল আমাকে এমন একটি শ্রেণি তৈরি করতে হবে যা আমার অ্যারে বা তালিকাকে আবৃত করে সিরিয়ালাইজযোগ্য এবং তারপরে আমি সেটিংস ডিজাইনারটিতে টাইপটি ব্যবহার করতে সক্ষম হব। তবে এটি কীভাবে করবেন তা আমি নিশ্চিত নই।

উত্তর:


137

এছাড়াও আরও একটি সমাধান রয়েছে - সেটিংস ফাইলটির কিছুটা ম্যানুয়াল সম্পাদনা প্রয়োজন, তবে পরে ভিএস পরিবেশ এবং কোডে সূক্ষ্মভাবে কাজ করে। এবং কোনও অতিরিক্ত ফাংশন বা মোড়কের প্রয়োজন নেই।

জিনিসটি হ'ল, ভিএস int[]সেটিংস ফাইলে ডিফল্টরূপে সিরিয়ালাইজ করার অনুমতি দেয় - এটি আপনাকে ডিফল্টরূপে এটি নির্বাচনের অনুমতি দেয় না। সুতরাং, পছন্দসই নামের সাথে একটি সেটিংস তৈরি করুন (যেমন সামার টেস্টসেটিং) এবং এটি যেকোন প্রকারের (যেমন stringডিফল্টরূপে) করুন। পরিবর্তনগুলি সংরক্ষণ করুন।

এখন আপনার প্রজেক্ট ফোল্ডারে যান এবং পাঠ্য সম্পাদক (নোটপ্যাড, উদাহরণস্বরূপ) "বৈশিষ্ট্য \ সেটিংস.সেটেটিংস" ফাইলটি খুলুন বা "-> বৈশিষ্ট্য -> সেটিংস.সেটেটিংগুলিতে সলিউশন এক্সপ্লোরারে ডান ক্লিক করে আপনি এটি ভিএস-এ খুলতে পারেন can "," এর সাথে খুলুন ... "নির্বাচন করুন এবং তারপরে" এক্সএমএল সম্পাদক "বা" উত্স কোড (পাঠ্য) সম্পাদক "চয়ন করুন। খোলা এক্সএমএল সেটিংসে আপনার সেটিংসটি সন্ধান করুন (এটি দেখতে এরকম হবে):

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

থেকে "প্রকার" PARAM পরিবর্তন System.Stringকরতে System.Int32[]। এখন এই বিভাগটি এর মতো দেখাবে:

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

এখন পরিবর্তনগুলি সংরক্ষণ করুন এবং প্রকল্প সেটিংস পুনরায় খুলুন - voilà! - আমাদের কাছে টাইপ সহ সামার টেস্টসেটিংয়ের সেটিংস রয়েছে System.Int32[]যা ভিএস সেটিংস ডিজাইনার ( মানগুলিও) এর মাধ্যমে কোডের সাথে অ্যাক্সেস এবং সম্পাদনা করা যেতে পারে।


5
অসাধারণ. ভিজ্যুয়াল স্টুডিওতে সম্পাদক ব্যবহার করে কিছু স্থাপন করার জন্য, আপনাকে এই জাতীয় কিছু পেস্ট করা উচিত, এটি একটি স্ট্রিং অ্যারের জন্য, যা আমার প্রয়োজন ছিল <? XML version = "1.0" এনকোডিং = "utf-16"?> <অ্যারেঅফস্ট্রিং xMLns: xsi = " w3.org/2001/XMLSchema-instance " xmlns: xsd = " w3.org/2001/XMLSchema "> <string> স্ট্রিং 1 </string> <string> স্ট্রিং 2 </string> </ArrayOfString>
কার্স্টেন

9
+1 .. কেন বুঝতে হবে না কেন এটি উত্তর গৃহীত হয়নি .. কোনও অতিরিক্ত কোডের প্রয়োজন নেই (কেবলমাত্র বিদ্যমান এক্সএমএলের একটি লাইন সংশোধন করুন) এবং আপনি সুরক্ষা এবং সম্পূর্ণ বনাম ডিজাইনার সমর্থন পান!
ক্রিস

4
ক্রিস, ধন্যবাদ :) কথাটি হ'ল, আমি আমার উত্তরটি পরে যুক্ত করেছি তবে মূলভাবে গৃহীত উত্তর (প্রায় এক বছর পরে, আসলে :))। যদিও কেবল অভিজ্ঞতাটি ভাগ করে
দিচ্ছি

6
কৌতূহলী কারও জন্য, কনফিগারেশন ফাইলের এক্সএমএল সিনট্যাক্সটি int[]এটি দেখতে ( <setting name="SomeTestSetting" serializeAs="String"><value><ArrayOfInt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><int>1</int><int>2</int><int>3</int></ArrayOfInt></value></setting>
বেশিরভাগ

4
সম্মত, এটি আরও ভাল উত্তর, তাই আমি চিহ্নটি পরিবর্তন করেছি।
পাশেরউইঞ্জু

42

জমানো:

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

পুনরায় তৈরি করতে:

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

সম্পাদনা: হাবিলের পরামর্শ!


ঠিক আছে, সুতরাং দেখে মনে হচ্ছে আপনি ম্যানুয়ালি ডেটাটিকে স্ট্রিংয়ে সিরিয়ালাইজ করছেন এবং তদ্বিপরীত। আমার ধারণা এটি কাজ করবে, আমি কেবল স্ট্রিং সেটিং হিসাবে ডেটা সঞ্চয় করতে পারতাম। আমি এই জাতীয় কিছু করার কথা ভেবেছিলাম, তবে আমি আরও কিছু "পরিষ্কার" বা "মানক" বা আরও কিছু খুঁজছিলাম ET নেট। এর চেয়ে ভাল কিছু না হলে আমি এটি মনে রাখব। ধন্যবাদ
পাশেরউইঞ্জুয়

হাই, আমি তখন ম্যাকের অ্যাভিনিউতে যাব! (কনফিগার বিভাগ / বিভাগ গ্রুপ)
মাইক গ্লিসন জুনিয়র কৌতুরিয়ার

আমি এটি সঙ্গে যাচ্ছি কারণ এটি সহজ। সকল ধারণার জন্য ধন্যবাদ, আমি নিশ্চিত তারা রাস্তায় সাহায্য করবে।
পার্শ্ববর্তীগুয়ে

4
দ্রষ্টব্য: System.Linqকাজ করার জন্য উপরের কৌশলটির জন্য আপনার ব্যবহার / আমদানি যুক্ত করতে হবে।
শান হ্যানলি

11

এই ফলাফলটি অর্জনের জন্য অন্য একটি উপায় রয়েছে যা ব্যবহারে অনেক পরিচ্ছন্ন তবে আরও কোড প্রয়োজন। আমার একটি কাস্টম টাইপ এবং টাইপ রূপান্তরকারী নিম্নলিখিত কোডটি কার্যকর করা সম্ভব:

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 ...

তারপরে এই ধরণের রূপান্তরকারীকে টাইপকনভার্টারের উপকরণ হিসাবে কার্যকর করা:

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);
    }
}

মাইনিম্বারআরে ক্লাসে কিছু সুবিধামত পদ্ধতি সরবরাহ করে আমরা তারপরে তালিকাতে এবং সুরক্ষিতভাবে নিরাপদে নির্ধারণ করতে পারি, সম্পূর্ণ শ্রেণিটি দেখতে এমন কিছু দেখাচ্ছে:

[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(); }
}

শেষ অবধি, সেটিংসে এটি ব্যবহার করার জন্য আপনি উপরোক্ত ক্লাসগুলিকে কোনও সমাবেশে যুক্ত করে সংকলন করুন। আপনার সেটিংস.সেটেটিং এডিটরে আপনি কেবল "ব্রাউজ করুন" বিকল্পটি ক্লিক করুন এবং মাইम्बरবারি ক্লাসটি নির্বাচন করুন এবং আপনি চলে যাবেন।

আবার এটি অনেক বেশি কোড; তবে এটি সাধারণ অ্যারের চেয়ে অনেক বেশি জটিল ধরণের ডেটাতে প্রয়োগ করা যেতে পারে।


ধন্যবাদ এটি আকর্ষণীয় দেখায়। সুযোগ পেলেই আমি চেষ্টা করে দেখব।
পাশেরউইঞ্জুয়ে

3

সিস্টেম হিসাবে সংগ্রহ নির্ধারণ করুন। সংগ্রহ .আরলিলিস্ট এবং তারপরে:

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

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

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;
        }
    }
}

এটি একধরনের হ্যাকি অনুভব করে তবে এটি পরিস্কার এবং পছন্দসই হিসাবে কাজ করে কারণ কনস্ট্রাক্টর বলার আগে সম্পত্তিগুলি তাদের শেষ (বা ডিফল্ট) সেটিংসে আরম্ভ করা হয়।


4
অ্যাপ্লিকেশন সেটিং ফাইলগুলির জন্য ডিজাইনার কোডটি স্বয়ংক্রিয়ভাবে তৈরি করে এবং তাই এরকম পরিবর্তন যে কোনও সময় ডিজাইনারকে এমনকি দুর্ঘটনাক্রমে ব্যবহার করলে ওভাররাইট করা হবে।
কার্ল জি

1

ব্যবহৃত System.Object

উদাহরণ:

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

নির্যাস:

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

4
আমি সিস্টেম.অবজেক্টটি ব্যবহার করার চেষ্টা করেছি, তবে সেটিংসটি অধিবেশনটির মধ্যে স্থির ছিল না। (হ্যাঁ এটি একটি রিলিজ বিল্ড, একা একা ইনস্টল করুন, আপনি যা কিছু কল করতে চান, আমি আইডিই ব্যবহার করে ডিবাগ করছিলাম না)
ইমানুয়েল ভিন্টিলি

0

আমি মনে করি আপনি আপনার সেটিংস সিরিয়ালকরণ সম্পর্কে ঠিক বলেছেন। একটি নমুনার জন্য এই প্রশ্নের আমার উত্তর দেখুন:

দুটি অ্যাপসের মধ্যে একটি কনফিগারেশন ভাগ করার কৌশল?

আপনার এমন একটি সম্পত্তি থাকবে যা একটি অ্যারে যেমন:

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

0

কিছু ফাংশন তৈরি করুন যা কোনও স্ট্রিতে একটি ইন্টার অ্যারে রূপান্তর করে তবে প্রতিটি "" (স্থান) এর মতো একটি অক্ষর রাখে।

সুতরাং অ্যারেটি যদি 1,34,546,56 ডলার হয় তবে স্ট্রিংটি "1 34 645 56" হবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.