PDA

View Full Version : سوال: چطوری میشه return دو تا یا سه تا مقدار برگردونه



ma.rad
جمعه 16 اردیبهشت 1390, 20:50 عصر
من یه کلاس نوشتم یه مقداری بر می گردونه حالا میخوام دو یا سه مقدار برگردونه چی باید بنویسم
return DateNow

Farshid007
جمعه 16 اردیبهشت 1390, 20:57 عصر
یعنی چی
مثلا ما یه int داریم که مقدار 0رو برمی گردونه
مگه میشه دو تا int داشته باشیم

ma.rad
جمعه 16 اردیبهشت 1390, 21:05 عصر
بله البته من دوتا رشته میخوام برگردونم

ali.rezaei7
جمعه 16 اردیبهشت 1390, 21:07 عصر
سلام. اگر تعداد مقادیر متغیر نیست، از آرایه استفاده کنید.

اگر تعداد ثابت هست. دوتا آرگومان رو بصورت by refrence به تابع اراسل کنید تا مقدار دهی بشن.

private void func (out string s1,out string s2)
{
s1 = "value1";
s2 = "value2";
}
-------------------------------
string s1,s2;
func(out s1, out s2);
textBox1.Text = s1 + " " + s2;

Directx
جمعه 16 اردیبهشت 1390, 21:10 عصر
دوست عزیز تابع از اسمش معلومه که به ازای هر چند تا مقدار فقط یه مقدار برمی گردونه شما می تونیداز آرایه استفاده کنید یا اینکه متغیر هاتون رو رفرنس کنید به تابع و تو تابع تغییرش بدید

ma.rad
جمعه 16 اردیبهشت 1390, 21:12 عصر
میشه بیشتر توضیح بدید وکدش چطوری میشه

exlord
جمعه 16 اردیبهشت 1390, 21:13 عصر
اگه از .net 4 استفاده میکنی :
public Tuple<string, string> DoSomthing()
{
var retValue = new Tuple<string,string>("val1","val2");
return retValue;
}

در غیر این صورت میتونی یه کلاس تعریف کنی و اونو Return کنی ...

ma.rad
جمعه 16 اردیبهشت 1390, 21:19 عصر
من از .net 3.5 استفاده میکنم این قابلیت رو داره؟
در غیره اینصورت کلاسو چطوری بنویسم
درضمن تابع من استاتیک هست
public static string ShamsiDate()
{
System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar();
DateTime d = DateTime.Now;
string NewMonth = p.GetMonth(d).ToString();
if (NewMonth.Length == 1)
NewMonth = "0" + NewMonth;

string NewDays = p.GetDayOfMonth(d).ToString();
if (NewDays.Length == 1)
NewDays = "0" + NewDays;

string DateNow = p.GetYear(d) + "/" + NewMonth + "/" + NewDays;
string Datehal = p.GetYear(d) + NewMonth + NewDays;
string Datefas= p.GetYear(d) + "-" + NewMonth + "-" + NewDays;
return DateNow;
}
میخوام datefas و datehal v را هم برگردونه

Felony
جمعه 16 اردیبهشت 1390, 21:22 عصر
پس Struct برای چی آفریده شده ؟! باید به وسیله Struct یک Data Type شخصی بنویسید .

یک Struct به صورت زیر تعریف میکنید :

public struct result
{
public string a, b;
}

اون result اسم Struct تون هست ، حالا یک تابع مینویسید که نوع برگشتیش از نوع Struct ی که تعریف کردید باشه ، مثلا :

private result Do()
{
result r;
r.a= "C";
r.b= "#";
return r;
}

و به صورت زیر هم ازش استفاده میکنید :

result test = Do();
MessageBox.Show(test.a + test.b);

ma.rad
جمعه 16 اردیبهشت 1390, 21:29 عصر
میشه رو کد من توضیح بدید چون static نه struck

ali.rezaei7
جمعه 16 اردیبهشت 1390, 21:33 عصر
تو سی شارپ که یک زبان شی گراست از struct به ندرت استفاده میشه.مثلا در برنامه نویسی Unmanaged ازش استفاده می کنیم. برای اینکار پارامترها رو by refrence بفرسته کافیه. مثال که زدم براتون.

Felony
جمعه 16 اردیبهشت 1390, 21:38 عصر
توضیح که دادم ، برای تابع شما Data Type به صورت زیر میشه :

public struct Dateres
{
public string DateNow, Datehal, Datefas;
}

تابعتون به صورت زیر باید تغییر پیدا کنه :

public static Dateres ShamsiDate()
{
System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar();
DateTime d = DateTime.Now;
string NewMonth = p.GetMonth(d).ToString();
if (NewMonth.Length == 1)
NewMonth = "0" + NewMonth;

string NewDays = p.GetDayOfMonth(d).ToString();
if (NewDays.Length == 1)
NewDays = "0" + NewDays;

string DateNow = p.GetYear(d) + "/" + NewMonth + "/" + NewDays;
string Datehal = p.GetYear(d) + NewMonth + NewDays;
string Datefas = p.GetYear(d) + "-" + NewMonth + "-" + NewDays;

Dateres r;
r.Datefas = DateNow;
r.Datehal = Datehal;
r.DateNow = DateNow;
return r;
}

به صورت زیر هم میتونید ازش استفاده کنید :

Dateres test = ShamsiDate();
MessageBox.Show(test.Datefas);
MessageBox.Show(test.Datehal);
MessageBox.Show(test.DateNow);

sdcsada
جمعه 16 اردیبهشت 1390, 21:39 عصر
با سلام بر شما:
من تا به حال ندیدم که بشه چند مقدار را با return برگرداند. اما میشه آرایه یا لیستی از عناصر را برگرداند.
برای این کار شما می تونید به این صورت تابع یا زیر برنامه خودتون را تغییر بدید:
راه اول:

privateobject[] getSomeData()
{
object[] mydata = { 256, "Here's you daddy" };
// or
// return new[] { "value1", "value2", 3 };
// mydata.SetValue(255,0);
return mydata;
}
privatevoid button1_Click(object sender, EventArgs e)
{
// to use the methodobject[]
object[] somedata = getSomeData();
MessageBox.Show(somedata[0].ToString(), somedata[1].ToString());
}


راه دوم:
نوع پارامتر های تابع خود را از نوع ref یا out انتخاب کنید. توی این لینک کامل توضیح داده:
http://stackoverflow.com/questions/748062/how-can-i-return-multiple-values-from-a-function-in-c

ali.rezaei7
جمعه 16 اردیبهشت 1390, 21:49 عصر
دوستان اگه با برنامه نویسی سی شارپ کاملا آشنا نیستند، بهتره روش های منسوخ شده رو ارایه ندند.

Felony
جمعه 16 اردیبهشت 1390, 22:00 عصر
تو سی شارپ که یک زبان شی گراست از struct به ندرت استفاده میشه.مثلا در برنامه نویسی Unmanaged ازش استفاده می کنیم. برای اینکار پارامترها رو by refrence بفرسته کافیه. مثال که زدم براتون.
جدی ؟ #C که یک زبان نوگرا هست چرا از این روش های منسوخ شده پشتیبانی میکنه ؟ کجا و تو کدوم Document یا Note ی مایکروسافت اعلام کرده که Struct منسوخ شده ؟ اصلا این موضوع چه ربطی به شئ گرا بودن داره ؟ مثلا Delphi یا ++VC شئ گرا نیستن ؟ یا اینکه تو این زبان ها امکان ارسال پارامتر به صورت ارجاع به مرجع وجود نداره ؟

arta.nasiri
جمعه 16 اردیبهشت 1390, 22:09 عصر
سلام

میتونی از Tuple استفاده کنی به شکل زیر

فراخوانی تابع
int a = 5;
Tuple<int, string> tuple = func(a);
int result = tuple.Item1;
string value = tuple.Item2;
MessageBox.Show(string.Format("Function return {0} and {1}", result.ToString(), value));

تابع
public Tuple<int, string> func(int input)
{
int result = (2 * input);
string resultValue = "one";
return Tuple.Create(result, resultValue);
}

ali.rezaei7
جمعه 16 اردیبهشت 1390, 22:20 عصر
جدی ؟ #C که یک زبان نوگرا هست چرا از این روش های منسوخ شده پشتیبانی میکنه ؟ کجا و تو کدوم Document یا Note ی مایکروسافت اعلام کرده که Struct منسوخ شده ؟ اصلا این موضوع چه ربطی به شئ گرا بودن داره ؟ مثلا Delphi یا ++VC شئ گرا نیستن ؟ یا اینکه تو این زبان ها امکان ارسال پارامتر به صورت ارجاع به مرجع وجود نداره ؟

شما سی شارپ رو با اون زبان های برنامه نویسی تحت ویندوز مقایسه نکن.
فلسفه این زبان کلا با اونا فرق می کنه.
حوصله کل کل ندارم.
عبارت "return multiple value from a function c#" رو گوگل کنید ببنید چند نفرشون روش شما رو بکار بردند.

Felony
جمعه 16 اردیبهشت 1390, 22:41 عصر
دوستان اگه با برنامه نویسی سی شارپ کاملا آشنا نیستند، بهتره روش های منسوخ شده رو ارایه ندند.

عبارت "return multiple value from a function c#" رو گوگل کنید ببنید چند نفرشون روش شما رو بکار بردند.
بنده هم وقت اضافی ندارم بیام اینجا کل کل کنم ، گوگل کردن یک عبارت مشخص کننده منسوخ شدن چیزی نیست ، هست ؟!
ممکنه روش پیشنهادی شما معمول تر باشه ولی مسنوخ شدن Struct هیچ مرجع و دلیل فنی نداره پس الکی نیاید و یک روش درست و زیر سوال ببرید و کاربر رو مجبور کنید که جوابتون رو بده ، اگر دلیل فنی یا مرجع معتبری داشتید که منسوخ شدن این روش رو تائید میکنه ارائه کنید تا ما هم ازش استفاده نکنیم !

javad_r_85
جمعه 16 اردیبهشت 1390, 23:19 عصر
return تنها یک مقدار را بر می گردونه برای برگردون چندین مقدار از یک تایع می توانید از طریق استفاده از کلمه ref یا out قبل از پارامترهای استفاده کنید بگرید پیدا می کنید.

ali.rezaei7
شنبه 17 اردیبهشت 1390, 00:26 صبح
لعنت به برق رفتگی که اگه بره زندگی برنامه نویس رو هم با خودش می بره.

ممکنه روش پیشنهادی شما معمول تر باشه ولی مسنوخ شدن Struct هیچ مرجع و دلیل فنی نداره پس الکی نیاید و یک روش درست و زیر سوال ببرید و کاربر رو مجبور کنید که جوابتون رو بده ، اگر دلیل فنی یا مرجع معتبری داشتید که منسوخ شدن این روش رو تائید میکنه ارائه کنید تا ما هم ازش استفاده نکنیم !

ببینید دوست عزیز روشی که شما انتخاب کردید عملی هستش. اما نه اصولی هست و نه روشی درست(البته در سی شارپ).
شما همچین تو پست اولتون گفتید که مگه strcut آفریده نشده؟ که من برای یک لحظه فکر کردم در بخش سی دارم فعالیت می کنم.
تو سی شارپ برای انجام دادن چنین کارهایی نیازی نیست که از این روش های منسوخ استفاده کنید. چون راه های خیلی بهینه تری وجود داره که دوستان به تک تک اونا اشاره کردند. خلاصه در برنامه نویسی باید اصول و استانداردهای اون زبان رو که داریم تحت اون برنامه نویسی می کنیم رورعایت کنیم دیگه.
البته من وقتی می گم منسوخ شده، منظورم اون روشی که شما در سی شارپ بکار بردید. نه خود ماهیت Struct.
موفق باشید.

exlord
شنبه 17 اردیبهشت 1390, 11:46 صبح
تعریف Tuple تو .net 3
T هارو به هر تعداد که بخواین میتونین تعریف کنین ...
public class Tuple<T1, T2, T3>
{
public T1 Item1 { get; set; }
public T2 Item2 { get; set; }
public T3 Item3 { get; set; }
public Tuple(T1 Item1, T2 Item2, T3 Item3)
{
this.Item1 = Item1;
this.Item2 = Item2;
this.Item3 = Item3;
}
}

public static Tuple<string, string, string> ShamsiDate()
{
System.Globalization.PersianCalendar p = new System.Globalization.PersianCalendar();
DateTime d = DateTime.Now;
string NewMonth = p.GetMonth(d).ToString();
if (NewMonth.Length == 1)
NewMonth = "0" + NewMonth;

string NewDays = p.GetDayOfMonth(d).ToString();
if (NewDays.Length == 1)
NewDays = "0" + NewDays;

string DateNow = p.GetYear(d) + "/" + NewMonth + "/" + NewDays;
string Datehal = p.GetYear(d) + NewMonth + NewDays;
string Datefas = p.GetYear(d) + "-" + NewMonth + "-" + NewDays;
return new Tuple<string, string, string>(DateNow, Datehal, Datefas);
}

var tt = ShamsiDate();