PDA

View Full Version : سوال: آرایه global



f_g1348
شنبه 24 تیر 1391, 13:56 عصر
سلام
چطور میتونم آرایه ای را در زیر برنامه تعریف کنم که در تمان برنامه قابل دسترس باشد ؟(global)

tooraj_azizi_1035
شنبه 24 تیر 1391, 14:13 عصر
سلام
آرایه ای که داخل یک متد تعریف می شه فقط داخل همون متد قابل دستیبابی است.:بوس:

f_g1348
شنبه 24 تیر 1391, 14:16 عصر
خوب چکار کنم که بیرون متد هم بشه استفاده کرد ؟

tooraj_azizi_1035
شنبه 24 تیر 1391, 14:24 عصر
بیرون از متد تعریف کن.

f_g1348
یک شنبه 25 تیر 1391, 07:49 صبح
خوب مشکل من اینجاست که ابعاد اولیه برای آرایه ندارم و در یکی از متدها این ابعاد حساب میشه و می خواهم آنجا این آرایه یه جورایی ابعادش مشخص بشه
در vb.net وقتی آرایه ای را بدون ابعاد در ابتدا تعریف می کنیم می توان با دستور redim دوباره ابعاد را مشخص کرد ، در اینجا چگونه است ؟

f_g1348
یک شنبه 25 تیر 1391, 11:21 صبح
کسی نیست راهنمایی کنه ؟

ASKaffash
یک شنبه 25 تیر 1391, 12:24 عصر
سلام
از جنریک استفاده کن و Static هم باشد :
public class MyClass
{
public static List<int> a =new List<int>();
}
حالا هم پویا است و هم سراسری

tooraj_azizi_1035
یک شنبه 25 تیر 1391, 12:49 عصر
باید از متد Array.CreateInstance استفاده کنی:


using System;
public class SamplesArray {

public static void Main() {

// Creates and initializes a multidimensional Array of type String.
int[] myLengthsArray = new int[2] { 3, 5 };
int[] myBoundsArray = new int[2] { 2, 3 };
Array myArray=Array.CreateInstance( typeof(String), myLengthsArray, myBoundsArray );
for ( int i = myArray.GetLowerBound(0); i <= myArray.GetUpperBound(0); i++ )
for ( int j = myArray.GetLowerBound(1); j <= myArray.GetUpperBound(1); j++ ) {
int[] myIndicesArray = new int[2] { i, j };
myArray.SetValue( Convert.ToString(i) + j, myIndicesArray );
}

// Displays the lower bounds and the upper bounds of each dimension.
Console.WriteLine( "Bounds:\tLower\tUpper" );
for ( int i = 0; i < myArray.Rank; i++ )
Console.WriteLine( "{0}:\t{1}\t{2}", i, myArray.GetLowerBound(i), myArray.GetUpperBound(i) );

// Displays the values of the Array.
Console.WriteLine( "The Array contains the following values:" );
PrintValues( myArray );
}


public static void PrintValues( Array myArr ) {
System.Collections.IEnumerator myEnumerator = myArr.GetEnumerator();
int i = 0;
int cols = myArr.GetLength( myArr.Rank - 1 );
while ( myEnumerator.MoveNext() ) {
if ( i < cols ) {
i++;
} else {
Console.WriteLine();
i = 1;
}
Console.Write( "\t{0}", myEnumerator.Current );
}
Console.WriteLine();
}
}
/*
This code produces the following output.

Bounds: Lower Upper
0: 2 4
1: 3 7
The Array contains the following values:
23 24 25 26 27
33 34 35 36 37
43 44 45 46 47
*/




البته در کد شما myArray قبلاٌ باید به طور سراسری تعریف بشه. این متد طول هر بعد رو به عنوان یک آرایه و اندیس های شروع رو هم به عنوان یک آرایه می گیره و آرایه رو ایجاد می کنه:
http://msdn.microsoft.com/en-us/library/x836773a.aspx
شما به تعداد ابعادت باید آرایه ای رو که طول هر بعد رو پر می کنه رو مقدار دهی کنی مثلاً:
3 بعدی: 3 مقدار در آرایه
4 بعدی چهار مقدار در آریه ....

کد بالا ایجاد 2 بعدی بود این سه بعدی است:

int[] myLengthsArray = new int[3] { 3, 7, 5 }; int[] myBoundsArray = new int[3] { 2, 1,3 };
Array myArray=Array.CreateInstance( typeof(String), myLengthsArray, myBoundsArray );



یعنی آرایه ای که طول بعد اولش 3 دوم 7 و سوم 5 است و اندیس شروعشان به ترتیب 2، 1 و 3 است. که شما برای سهولت همان 0 قرار دهید. تعداد عناصر هر دو آرایه myLengthsArray و myBoundsArray باید برابر باشد.

f_g1348
دوشنبه 26 تیر 1391, 10:36 صبح
سلام دوستان
من چنین چیزی رو در ابتدای برنامه تعریف می کنم

string[] Words_Of_Original;
و در یکی از متدها از کد زیر استفاده می کنم

string[] Words_Of_Original = txt_Orig.Text.Split(new char[] { ' ', '\n' });
و برنامه درست کار می کند ولی در متد های دیگر مقادیر آرایه دیده نمی شود
چه کار باید بکنم ؟

sirvan-me
دوشنبه 26 تیر 1391, 11:08 صبح
سلام دوستمون راست میگه چرا از List ها استفاده نمی کنی ... بیرون متدت یه لیست به شکل زیر تعریف کن :
List<string> List_Words = new List<string>();
بعد تو متدت خروجی تابع Split رو تو این لیست بریز ... حالا تو هر متدی می تونی سایز لیستت رو فراخونی کنی . تغییر بدی یا مثل آرایه به محتویاتش دسترسی داشته باشی و ...
List_Words.AddRange(txt_Orig.Text.Split(new char[] { ' ', '\n' }));

توابع خیلی بیشتری هم نسبت به آرایه برای لیست تعریف شده .. خودت میتونی ببینی :چشمک:

f_g1348
دوشنبه 26 تیر 1391, 12:47 عصر
خوب دوست عزیز اگر از این روش استفاده کنم چطور می تونم به خانه مثلاً شماره 6 لیست دسترسی داشته باشم و مقدار آنرا عوض کنم؟
مثلا برای کد زیر چگونه در لیست پیاده سازی شود ؟

if (Words_Of_Original[all_word_count - 1] == " ") {
Words_Of_Original[all_word_count - 1] = ".";
}
که Words_Of_Original یک آرایه است

tooraj_azizi_1035
دوشنبه 26 تیر 1391, 15:13 عصر
ببین تو چرا نمی گی که هدف کلیت چیه؟
بگو می خوای دقیقاً چی کاری کنی تا بهترین راه رو بچه ها بگن.:متفکر:

sirvan-me
دوشنبه 26 تیر 1391, 16:13 عصر
خوب دوست عزیز اگر از این روش استفاده کنم چطور می تونم به خانه مثلاً شماره 6 لیست دسترسی داشته باشم و مقدار آنرا عوض کنم؟
مثلا برای کد زیر چگونه در لیست پیاده سازی شود ؟

if (Words_Of_Original[all_word_count - 1] == " ") {
Words_Of_Original[all_word_count - 1] = ".";
}
که Words_Of_Original یک آرایه است

همونطوری که تو آرایه با اندیس به خونه های آرایه دسترسی داری ... ساده ترین راه دستیابی به عناصر لیست هم همونه ...

textbox1.Text = List_Words[1].ToString();

خب دیگه خودت به مثالی که زدی تبدیلش کن ...

f_g1348
سه شنبه 27 تیر 1391, 11:09 صبح
من الان دقیقاً برنامم را تشریح می کنم
در برنامه یک textbox وجود داره که کاربر درون آن متن فارسی تایپ می کنه ( جمله که با نقطه از هم جدا میشوند ) حالا اهداف من در زیر آمده :

ادغام چند جمله به اختیار کاربر ( بدین صورت که در برنامه کاربر عدد می دهد و به تعداد اون اعداد ، جملات با هم ادغام می شوند یعنی نقاط انتهایی هر جمله تا رسیدن به تعداد مطلوب حذف می شود )
مثلاً کل متن ما 8 جمله دارد و کاربر عدد 2 را وارد می کند پس یکی در میان باید نقاط پیدا شده و حذف شوند
برای این کار من گفتم آرایه ای تعریف کنم که کل متن را بصورت کلمه به کلمه در خود نگه دارد و سپس از ابتدا جستجو شود و وقتی به کاراکتر نقطه رسد یک شمارنده را افزایش داده و و باقیمانده تقسیم شمارندخ بر عدد ورودی کاربر اگر صفر شد نقطه رو بیخیال میشه و در غیر اینصورت نقطه را با فضای خالی پر می کنه
حالا مشکل من اینجاست که در ابتدا ابعاد آرایه را ندارم و پس از ورود متن ابعاد مشخص میشود و من این آرایه را در تمام متد ها و زیربرنامه ها لازم دارم .
وقتی از list استفاده می کنم نمی تونم یک خانه بخصوصش را پاک کنم و آرایه با طول متغییر هم مثل vb.net ندارد که با دستور redim بتوانم ابعاد آرایه را مشخص کنم .
لطفاً من را راهنمایی بفرمایید

sirvan-me
سه شنبه 27 تیر 1391, 11:38 صبح
وقتی از list استفاده می کنم نمی تونم یک خانه بخصوصش را پاک کنم و آرایه با طول متغییر هم مثل vb.net ندارد که با دستور redim بتوانم ابعاد آرایه را مشخص کنم .

شما برای اینکه بتونی یکی از خونه های لیست رو پاک کنی :

1 ) اگر بر حسب مقدار خونه بخوای اون رو پاک کنی از کد زیر استفاده کن :

List_Words.Remove("Word");

2 ) اگر بر حسب اندیس خونه می خوای خونه ای از لیست رو پاک کنی از کد زیر استفاده کن :

List_Words.RemoveAt(9);

3 ) اگر می خوای همه ی خونه هایی که حاوی یه مقدار خاصن پاک کنی هم از کد زیر استفاده کن :

List_Words.RemoveAll(str => str == "Word");

Mahmoud.Afrad
سه شنبه 27 تیر 1391, 12:01 عصر
فقط لیست رو به صورت سراسری تعریف میکنی
List<string> sentences = new List<string>();میتونی کل محتوای لیست رو پاک کنی
sentences.Clear();به این صورت هم میتونی مقداردهی کنی(با توجه به توضیحاتت)
sentences = textBox1.Text.Split('.').Where(s => s != "" && s != null).ToList();به اینصورت هم میتونی یک خانه رو حذف کنی
sentences.RemoveAt(اندیس);

f_g1348
چهارشنبه 28 تیر 1391, 10:50 صبح
دوستان يه سوال
وقتي محتواي يك خانه را پاك كردم ، مي خواهم محتواي داخلش فضاي خالي باشد (" ") آيا با پاك كردن مقدار داخلش كلاً آن خانه پاك نمي شود ؟

sirvan-me
چهارشنبه 28 تیر 1391, 11:16 صبح
اگر از تابع های Remove استفاده کنی ، کلا اطلاعات اون خونه حذف میشه . باید مقدار اون خونه رو set کنی .

Mahmoud.Afrad
چهارشنبه 28 تیر 1391, 11:17 صبح
با remove اون خانه از لیست حذف میشه. میتونی با اندیس مقدار تهی رو ست کنید
sentences[اندیس] = "";

f_g1348
چهارشنبه 28 تیر 1391, 11:37 صبح
سلام دوستمون راست میگه چرا از List ها استفاده نمی کنی ... بیرون متدت یه لیست به شکل زیر تعریف کن :
List<string> List_Words = new List<string>();
بعد تو متدت خروجی تابع Split رو تو این لیست بریز ... حالا تو هر متدی می تونی سایز لیستت رو فراخونی کنی . تغییر بدی یا مثل آرایه به محتویاتش دسترسی داشته باشی و ...
List_Words.AddRange(txt_Orig.Text.Split(new char[] { ' ', '\n' }));

توابع خیلی بیشتری هم نسبت به آرایه برای لیست تعریف شده .. خودت میتونی ببینی :چشمک:
دوست عزیز من از کد شما استفاده کردم ولی پیغام خطای زیر را می دهد
Error 1 Using the generic type 'System.Collections.Generic.List<T>' requires 1 type arguments F:\text segmentation in c#\segmentation2\segmentation2\Form1.cs 54 13 segmentation2

sirvan-me
چهارشنبه 28 تیر 1391, 12:41 عصر
دوست عزیز من از کد شما استفاده کردم ولی پیغام خطای زیر را می دهد
Error 1 Using the generic type 'System.Collections.Generic.List<T>' requires 1 type arguments F:\text segmentation in C#‎‎‎‎‎‎\segmentation2\segmentation2\F orm1.cs 54 13 segmentation2


من خودم کدی رو که بهتون دادم تست کردم . اصلا خطا نمیده .

اینم برنامه ای که توش کدی که بهت دادم نوشتم ( یذره کاملتر )


richTextBox1.Text = richTextBox1.Text.Replace(textBox1.Text.Trim(), "").Replace(" ", " ").Trim();


برای اینکه فاصله های اضافی اول و آخر هم برداره تو قسمت Event کلیک Button2 کد بالا رو به جای قبلی بزن .

f_g1348
چهارشنبه 28 تیر 1391, 14:03 عصر
من که نفهمیدم مشکل من تو چیه ولی کد شما رو که کپی کردم کار کرد