C# & .Net Flashcards

1
Q

تعریف متود
static
چه فایده ای دارد؟

A

با استفاده از متود استاتیک در یک کلاس می توانیم بدون ایجاد یک شی از آن کلاس به این متود دسترسی پیدا کنیم.
تعریف متدهای استاتیک می تواند به الگوی
factory pattern
کمک کند و به عنوان یک کارخانه عمل کند و نمونه هایی از آن کلاس را برای ما بسازد.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

چرا در
arraylist
نیاز به تبدیل نوع داده
(casting)
داریم اما در
List<>
این نیاز را نداریم؟

A

arraylist
مجموعه ای از اشیا است که هر نوع داده ای می تواند باشد زیرا نوع آن
object
است.
وقتی یک شی را از
arraylist
میخوانیم، آن شی به عنوان
object
بازگشت داده می شود.
برای اینکه به متودها و ویژگی های آن شی خودمان دسترسی داشته باشیم، باید این
object
را به شی خودمان تبدیل
(casting)
کنیم.
اما
List<>
مجموعه ای از اشیا با نوع داده ی مشخص است.
مثلا
List<Product>
این لیست بالا فقط اشیایی از جنس
Product
می تواند داشته باشد.</Product>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

در c#
بهترین متود برای مرتب کردن آیتم ها کدام است؟

A

OrderBy(p=>p.Name)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

برای
nullable
کردن یک متغیر در کلاس چگونه عمل می کنیم؟

A

در
Constructor
به شکل زیر می نویسیم:
public Product (string name, decimal? price = null)
{
this.name = name;
this.price = price;
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

انواع تایپ ها در
generic
را بگویید و مثالی از کد آن بزنید.

A

Open Type:
نوع پارامتر مشخص نمی شود.
Closed Type:
نوع پارامتر مشخص می شود.
این نوع بهتر است زیرا در زمان اجرا شدن کد، خطاها زودتر و دقیق تر مشخص می شوند.
کلاس جنریک
Dictionary:

Dictionary<string, int> wordCount = new Dictionary<string, int>();
wordCount[“Hello”] = 1;
wordCount[“World”] = 2;

foreach (var word in wordCount)
{
Console.WriteLine($”{word.Key}: {word.Value}”);
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Guid
در دات نت چیست؟

A

Guid
Globally Unique Identifier
یک نوع داده خاص در دات نت است که برای شناسایی منحصر به فرد اشیا در سیستم ها و دیتابیس ها به کار می رود.
مانند
ID
عمل می کند.
یک
Guid
معمولاً به صورت یک رشته متنی با فرمت خاص نمایش داده می‌شود که شامل 32 رقم هگزادسیمال و 4 خط تیره است.
public class User
{
public Guid Id { get; set; }
public string Name { get; set; }

public User (string Name)
{
    Id = Guid.NewGuid();
    this.Name = Name;

}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

تابع
ConvertAll()
چه نوع تابعی است و توضیح دهید.

A

تابع
ConvertAll()
یک تابع جنریک است.
و این امکان را می دهد که یک
List<T>
لیست از نوع
T
را به لیست دیگری از نوع
TOutput
List<TOutput>
تبدیل کنیم.
List<string> numbers = new List<string> {"1", "2", "3"};
List<int> newNumbers = numbers.ConvertAll<int>(x=> int.Parse(x));
foreach (var number in newNumbers)
{
Console.WriteLine(number);
}</int></int></string></string></TOutput></T>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

تفاوت
Refrence Type
و
Value Type
را بنویسید

A

Refrence Type
(نوع مرجع)
به اشیا
(object)
اشاره دارد و در حافظه به صورت
refrence
ذخیره می شود.
Value Type
مستقیم به خود داده اشاره دارد.
مثل
float, int, struct

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Generic Types

Refrence Type Constraint
چیست؟

A

محدودیت نوع مرجع یا
Refrence Type Constraint
این امکان را می دهد که فقط و فقط از مرجع
(class)
به عنوان نوع پارامتر می توان استفاده کرد و مثلا نمی توان از
float, int, struct , …
به عنوان نوع پارامتر استفاده کرد.
public class Repository<T> where T : class
{
private List<T> items = new List<T>();</T></T></T>

public void AddItem(T item)
{
    items.Add(item);
}

public T GetItem(int iindex)
{
    return items[iindex];
} }
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Generic Types

Value Type Constraint
چیست؟

A

محدودیت نوع مقدار یا
Value Type Constraint
این امکان را می دهد که فقط از نوع مقدار باید برای نوع پارامتر استفاده کنیم.
مثل
imt, enum, …
class ValSample<T> where T : struct {
}</T>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Generic Types

Constructor Type Constraint
چیست؟

A

محدودیت نوع سازنده
نعیین می کند، پارامتری که می گیرد باید سازنده یا
constructor
بدون پارامتر داشته باشد.

public class Sample
{
public T CreateInstance<T>() where T : new()
{
return new T();
}
}</T>

public class ExampleClass
{
public string Name { get; set; }

public ExampleClass ()
{
    Name = "Default Name";
} } Sample sample = new Sample(); ExampleClass instance = sample.CreateInstance<ExampleClass>(); Console.WriteLine(instance.Name);
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Generic Types

Conversion Type Constraint
چیست؟

A

محدودیت نوع تبدیل
این امکان را می دهد که
نوع پارامتر انتخابی باید از یک اینترفیس یا یک کلاس مشخص پیروی کند.
public class Comparer<T> where T : IComparable<T>
{
public bool IsGreaterThan(T first, T second)
{
return first.CompareTo(second) > 0;
}
}
int num1 = new int();
int num2 = new int();
num1 = 10;
num2 = 6;
var comparer = new Comparer<int>();</int></T></T>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Generic Types

Type Inference in Generic Methods

A

Type Inference
این امکان را می دهد که در متد جنریک، نوع آرگومان را به طور مستقیم مشخص نکنیم.
بلکه با توجه به آرگومانی که به متد جنریک می دهیم، خود کامپایلر متوجه می شود این متد از چه نوعی است.
static List<T> MakeList<T>(T first, T second)
List<string> list = MakeList<string>("Line 1", "Line 2");
در آبجکت بالا دیگر نیازی نیست به متد
MakeList
نوع آرگومان
string
را پاس دهیم بلکه مثال پایین می گوید چزور کامپایلر تشخیص می دهد که آرگومان از نوع
string
است.
List<string> list = MakeList("Line1", "Line2");</string></string></string></T></T>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

اگر نوع پارامتر بدون محدودیت یعنی
unconstrained
باشد
چگونه می توان آن را مقایسه کرد؟

A

۱. مقایسه با
== و !=
در نوع‌های بدون محدودیت
فقط برای
. null
فقط با
== و !=
می توان آن پارامتر را با
null
مقایسه کرد و نمی توان دو پارامتر از نوع
T
را با
== و !=
مقایسه کرد. چون هیچ تضمینی نیست که این دو پارامتر از نوع یکسان باشند.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

reference comparison

A

مقایسه ی مرجع یا
reference comparison
دو مقدار را با هم مقایسه می کند که آیا هر دو به یک شی یا یک مرجع اشاره می کنند یا خیر.
string str1 = “Hello”;
string str2 = “Hello”;
Console.WriteLine(str1 == str2);
خروجی مقایسه بالا
false
می شود زیرا
مقدار داخل هر دو
“hello”
اما
str1 و str2
دو شیء مستقل هستند،
یعنی به دو آدرس مختلف در حافظه اشاره دارند.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

کلاس جنریک
Tuple (T1, T2)

A

این کلاس دو مقدار از انواع مختلف را ذخیره کند

مثلا
Tuple(string, int)
Tuple(int, string) pair = new Tuple(int, string)(10, “value”);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

arraylist
و
List
را از لحاظ جنریک بودن یا نبودن چگونه مقایسه می کنید؟

A

ArrayList
یک مجموعه غیر جنریک است یعنی مجموعه ای از اشیا
(object)
است که نیاز به
boxing و unboxing
یعنی تبدیل نوع داده،
داریم.
List
یک مجموعه جنریک است که نیاز به
boxing و unboxing
نداریم.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Generics

typeof(genericMethod)

A

این متد
typeof()
یک ورودی جنریک متود می گیرد که نوع جنریک و نوع پارامتر آن جنریک را مشخص می کند.
public class ReflectionExample
{
public static void ShowTypeInfo<x>()
{
Type GenericDefinition = typeof(Dictionary<,>);
Console.WriteLine($"Dictionary<,>: {GenericDefinition}");</x>

    Type constructedtype = typeof(List<x>);
    Console.WriteLine($"List<x>: {constructedtype}");

    Type closedtype = typeof(Dictionary<int,string>);
    Console.WriteLine($"Dictionary<int,string>: {closedtype}");
} } که  x بالا می تواند هر نوع داده ای باشد مثل int, string, list , ...
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

GetGenericTypeDefinition()

A

این متود یک ورودی جنریک متود را می گیرد و فقط نوع جنریک متود را مشخص می کند.
GetGenericTypeDefinition(List<int>)
ورودی زیر را می دهد:
System.Collections.Generic.List`1[T]</int>

مثال دیگر:
Type constructedtype = typeof(List<int>);
Type getgenericdefinitiontype = constructedtype.GetGenericTypeDefinition();
Console.WriteLine(getgenericdefinitiontype);
ورودی زیر را می دهد:
System.Collections.Generic.List`1[T]
Console.WriteLine(typeof(List<int>));
ورودی زیر را می دهد:
System.Collections.Generic.List`1[System.Int32]
Console.WriteLine(constructedtype == getgenericdefinitiontype);
ورودی زیر را می دهد:
false</int></int>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

MakeGenericType()

A

یک قالب جنریک اصلی داریم که می خواهیم نوع پارامترهای آن ها را مشخص کنیم و یک متود جنریک
closed type
بسازیم.
Type dictionary = typeof(Dictionary<,>); –قالب جنریک اصلی
Type cosntructedtype = dictionary.MakeGenericType(typeof(string), typeof(int)); –مشخص کردن نوع پارامترهای جنریک
Console.WriteLine(cosntructedtype);

21
Q

هم پوشانی در آرایه ها چه معایبی دارد که لیست ها از هم پوشانی پشتیبانی نمی کنند؟

A

class Animal { }
class Cat : Animal { }
class Turtle : Animal { }

Animal[] animals = new Cat[5];
در کد بالا چون
Cat
زیرکلاسی از
Animal
است،
آرایه ای از
Animal
به آرایه ای از
Cat
اشاره می کند.
اما به این آرایه ی
animals
نمی توان یک زیرکلاس دیگری که از یک نوع دیگری باشد، اضافه کرد، چون این آرایه فقط از آبجکت های
Cat
باید باشد.
مثلا کد پایین خطا می دهد:
animals[0] = new Turtle();
به همین دلیل جنریک ها در زبان سی شارپ از هم پوشانی پشتیبانی نمی کنند تا مانع بروز این خطا شوند.
مانند لیست در کد زیر:
List<Animal> animals = new List<Animal>();</Animal></Animal>

    // اضافه کردن آبجکت‌های Cat به لیست Animal
    animals.Add(new Cat());
    animals.Add(new Cat());

    // دسترسی به اعضای لیست
    foreach (Animal animal in animals)
    {
        animal.Speak();  // خروجی: Meow!
    }
22
Q

Nullable<T></T>

A

دراین نوع جنریک، پارامتر
T
از نوع
value type
است و نمی تواند برای نوع دیگری از پارامتر به کار رود.
در واقع این متد جنریک، یک
value Type
را به نوعی تبدیل می کند که می تواند نال باشد.

Hasvalue –>
چک می کند که متغیر مقدار دارد یا خیر

Nullable<DateTime> date = null; --> یک تاریخ نال پذیر بدون مقدار اولیه</DateTime>

if (!date.HasValue)
{
Console.WriteLine(“The date doesnt set yet.”);
}
date = DateTime.Now;
if (date.HasValue)
{
Console.WriteLine($”now date: {date}”);
}

23
Q

کاربرد
GetValueOrDefault()
برای متغیراز جنس
Nullable<T></T>

A

این متد یا خود
value
را برمی گرداند یا مقدار دیفالتی که به متد می دهیم را بر می گرداند.
static void Display(Nullable<int> x)
{
Console.WriteLine("HasValue: {0}", x.HasValue);
if (x.HasValue)
{
Console.WriteLine("Value: {0}", x.Value);
Console.WriteLine("Explicit conversion: {0}", x);
}
Console.WriteLine($"GetValueOrDefault: {x.GetValueOrDefault()}");
Console.WriteLine($"GetValueOrDefault: {x.GetValueOrDefault(10)}");</int>

}
static void Main(string[] args)
{

Nullable<int> x = new Nullable<int>();
Console.WriteLine("Instance without value:");
Display(x);
24
Q

boxing VS unboxing

A

boxing:
تبدیل مقدار ارزش به آبجکت
int? nullable = 5;
object boxednullable = nullable;

unboxing:
عکس عمل باکسینگ
یعنی تبدیل آبجکت به مقدار ارزش
int normal = int(boxednullable );

25
Q

کاربرد
عملگر
Null Coalescing
(??)
در سی شارپ چیست؟

A

دو تا مقدار را با هم مقایسه می کند و درصورت نال بودن مقدار اول، مقدار دوم را بر می گرداند
int? a = 5;
int b = 10;
int c = a ?? b;
c –> 5;

26
Q

Threadstart
کاربردش چیست؟

A

Threadstart
یک نوع
delegate
است که برای اشاره کردن به متودهای بدون پارامتر و بدون برگرداندن چیزی به کار می روند.
Delegate mydelegate = Threadstart(Mymethod)

27
Q

کوواریانس را تعریف کنید و مثال بزنید.
Covariance

A

کوواریانس این اجازه را به ما می دهد که یک جنریک از نوع مشتق شده را
به یک جنریک از نوع پایه تبدیل کنیم
به شرطی که جنریک فقط خواندنی باشد
یعنی
اگر
Cat
از
Animal
به ارث ببرد:
یک نوع جنریک با نوع مشتق‌شده
IEnumerable<Cat>
را به
IEnumerable<Animal>
می توانیم منتقل کنیم
IEnumerable<Cat> cats = new List<Cat>;
IEnumerable<Animal> animals = cats;
یه به عبارتی در کوواریانس، جنریک خاص تر به جنریک عمومی تر تبدیل می شود</Animal></Cat></Cat></Animal></Cat>

28
Q

کنتراواریانس را تعریف کنید و مثال بزنید.
Contravariance

A

کنتراواریانس این اجازه را به ما می دهد که یک جنریک از نوع پایه را به یک جنریک از نوع مشتق شده منتقل کنیم.
به شرطی که جنریک
write-only
باشد
یعنی
اگر
Cat
از
Animal
به ارث ببرد:
یک جنریک از نوع پایه
IComparer<Animal>
را به
IComparer<Cat>
می توانیم منتقل کنیم
در واقع وقتی
IComparer<Animal>
دو تا
Animal
را با هم مقایسه می کند، دوتا
Cat
را هم می تواند با هم مقایسه کند
IComparer<Animal> AnimalComparer = new AnimalComparer();
IComparer<Cat> CatComparer = AnimalComparer;
یا به عبارتی در کنتراواریانس، یک جنریک عمومی تر به خاص تر تبدیل می شود</Cat></Animal></Animal></Cat></Animal>

29
Q

چه زمانی یک تابع را به صورت
delegate
می نویسیم؟

A

1- زمانی که تابع بدون نام بخواهیم تعریف کنیم
2- بخواهیم آن تابع را به عنوان یک پارامتر به متودهای دیگر بدهیم
3- یک تابع منعطف بخواهیم بنویسیم
مثال:
Action<string> printreverse = delegate (string text) {
char[] chars = text.ToCharArray();
Array.Reverse(chars);
Console.WriteLine(new string(chars));
};
printreverse("Hello");</string>

30
Q

Iterators
چیست و چه کاربردی دارد؟

A

با
iterator
می توان به همه ی عناصر یک دنباله از آیتم ها دسترسی پیدا کرد، بدون اینکه نگران نوع دنباله باشیم که آرایه، لیست، لیست پیوندی و … است.
iterator
به‌جای بازگرداندن یکباره کل داده‌ها، هر بار یکی از عناصر را به ترتیب بازمی‌گرداند.
public class IterationSample : IEnumerable
{
object[] values;
int startingpoint;

  public IterationSample (object[] values, int startingpoint) { 
      this.values = values;
      this.startingpoint = startingpoint;
  }
  public IEnumerator GetEnumerator()
  {
      for (int index = 0; index < values.Length; index++)
      {
          yield return values[index];
      }
  }   }

object[] values = { “A”, “b”, “c”, “d”, “e” };
IterationSample iterator = new IterationSample(values, 2);
foreach (object value in values)
{
Console.WriteLine(value);
}

31
Q

استفاده از
GetEnumerator()
در
iterator

A

در ایتدا یک متد به اسم
CreateEnumerable()
تعریف می کنیم:
static IEnumerable<int> CreateEnumerable()
{
Console.WriteLine("{0}Start of CreateEnumerable()");</int>

 for (int i = 0; i < 3; i++)
 {
  
    yield return i;
     
 } }

IEnumerable<int> iterable = CreateEnumerable();
IEnumerator<int> iterator = iterable.GetEnumerator();</int></int>

while (iterator.MoveNext()) {
Console.WriteLine(iterator.Current);
}

32
Q

IEnumerable<>
چیست و چه کاربردی دارد؟

A

یک اینترفیس است که یک مجموعه قابل پیمایش
(iterable)
را می سازد.
تنها متد این اینترفیس، متد
GetEnumerator()
است.
public IEnumerator GetEnumerator();

33
Q

IEnumerator<>
چیست و چه کاربردی دارد؟

A

یک اینترفیس است که در یک مجموعه پیمایش می کند و به صورت گام به گام به عناصرآن مجموعه دسترسی دارد.
یک متد رایج آن، متد
MoveNext()
است که برای حرکت به عنصر بعدی استفاده می شود. وقتی به انتهای مجموعه برسد، این متد
false
را بر می گرداند.
Current:
این پراپرتی آخرین عنصر بازگشتی از
MoveNext
را برمی‌گرداند.

34
Q

کاربردهای رایج
iterator

A

1- کار با
big Data
مثل خواندن خط به خط یک فایل
2- فیلتر کردن داده ها یا تبدیل داده ها در یک لیست
با عملیات های
lazy
(پردازش تدریجی داده ها)
3- انجام چند درخواست شبکه به صورت موازی و سپس ترکیب نتایج آنها.

35
Q

static class

A

برای استفاده از کلاس استاتیک نیازی به ایجاد نمونه نیست، و مستقیم می توانیم از متدهای این کلاس استفاده کنیم.
public static class MathHelper
{
public static int Add(int a, int b)
{
return a + b;
}

public static int Subtract(int a, int b) {
    return a - b; 
}

public static int Multiply(int a, int b)
{
    return a * b;
}

public static double Divide(double a, double b) {
    if (b == 0)
    {
        throw new DivideByZeroException("Can not devide by zero!");

    }
    return a / b;
} }
36
Q

دسترسی جداگانه به
getter و setter
در ویژگی‌ها
(Properties)

A

این امکان دسترسی جداگانه به
getter
و
setter
در سی شارپ وجود دارد
زیرا مثلا می خواهیم یک پراپرتی در همان کلاس فقط مقدار دهی شود اما خارج از کلاس بتوان این ویژگی را خواند.
بنابراین باید
private set
و
public get
برای این ویژگی در کلاس ست کنیم
public string Name
{
get { return Name; }
private set {
Name = value;
}
}

37
Q

implicit typing
تایپ ضمنی
در سی شارپ

A

استفاده از تایپ ضمنی در سی شارپ با استفاده از
var
باعث می شود از تکرار نوع طولانی مانند ایجاد یک متغیر از جنریک ها جلوگیری شود
var dict = new Dictionary<int, string>();
در مثال بالا نیازی به تکرار
Dictionary<int, string>
نیست و به جای آن از
var
استفاده کردیم

38
Q

مهم ترین کاربرد
Anonymous Types
چیست؟

A

بدون اینکه نمونه ای از یک کلاس دیگر بسازیم، می توانیم یک شی با خصوصیاتی که می خواهیم ایجاد کنیم.
var tom = new {Name=”Tom”, Age= 20};

39
Q

درخت بیان چیست؟
Expression Trees

A

یک درخت بیان مجموعه‌ای از گره‌ها
(Nodes)
است که هر گره یک بیان
(Expression)
را نشان می‌دهد.
گره‌های برگ: مقادیر ثابت
(مثل 2 یا 3)
گره‌های والد: عملیاتی مثل جمع، تفریق، فراخوانی متد و … که گره‌های برگ را ترکیب می‌کنند.
3 +2
درخت بیان همیشه از پایین به بالا ساخته می شود

نمونه ای از کد درخت بیان و تبدیل آن به دلگیت و اجرا کردن آن:

Expression firstArg = Expression.Constant(4);
Expression secondArg = Expression.Constant(5);
Expression add = Expression.Add(firstArg, secondArg);
Console.WriteLine(add.ToString());
var compile = Expression.Lambda<Func<int>>(add).Compile();
Console.WriteLine($"result: " + compile());</int>

40
Q

Type Inference
استنباط نوع

A

بدون اینکه نیاز باشد شما در سی شارپ، نوع پارامتر را مشخص کنید، فقط کافی است پارامتر را به متود بدهیم و خود کامپایلر تشخیص می دهد که این پارامتر از چه نوعی است
مثالی از استنباط سه مرحله ای را در کد زیر می بینیم:

static void PerformTwoConversions<TInput, Tmiddle, TOutput>(
    TInput input,
    Converter<TInput, Tmiddle> firstConversion,
    Converter<Tmiddle, TOutput> secondConversion
    )
{
    Tmiddle middle = firstConversion(input);
    TOutput output = secondConversion(middle);
    Console.WriteLine(output);

    PerformTwoConversions(
"Another string",
text => text.Length,
length => Math.Sqrt(length) );
}
41
Q

Extension Method
روش های گسترش

A

Extension Method
در یک کلاس استاتیک نوشته می شود و اول پارامتر این متود با
this
شروع می شود.
نمونه هایی از
Extension Method
در
Enumerable
داریم:
Where, Select, OrderBy

var collection = list.Select(x=>x.value > 10);

متود های گسترش، خوانایی کد را بالا می برند.

42
Q

Select syntax in c#

A

var query = SampleData.AllUsers.Select(user => user);

43
Q

Multiple where syntax in c#

A

SampleData.AllDefects
.Where(defect => defect.Status != Status.Closed)
.Where(defect => defect.AssignedTo == tim)
.Select(defect => defect.Summary);

44
Q

Sorting in c# with OrderBy, ThenBy

A

در
Linq
در سی شارپ،
مرتب سازی اصلی لیست با
OrderBy
انجام می شود و مرتب سازی ثانویه لیست با
ThenBy
انجام می شود.
مثلا در کد زیر، اگر اسم های کاربران یکسان بود، بر اساس سن آن ها مرتب سازی می کند.
var sorted = people
.OrderBy(person => person.LastName) // مرتب‌سازی اولیه بر اساس نام خانوادگی
.ThenBy(person => person.Age); // مرتب‌سازی ثانویه بر اساس سن

45
Q

Group joins with join … into clauses

A

سینتکس
group join
به شکل زیر است که در واقع کار
right join
را انجام می دهد و به ازای هر رکورد از جدول اول، یک نتیجه بر می گرداند.
var query =
from defect in SampleData.AllDefects
join subscription in SampleData.AllSubscriptions
on defect.Project equals subscription.Project
into groupedSubscriptions
select new { Defect = defect, Subscriptions = groupedSubscriptions };

foreach (var entry in query)
{
Console.WriteLine(entry.Defect.Summary);
foreach (var subscription in entry.Subscriptions)
{
Console.WriteLine(“ {0}”, subscription.EmailAddress);
}
}

46
Q

Group By syntax in C#

A

SampleData.AllDefects.Where(defect => defect.AssignedTo != null)
.GroupBy(defect => defect.AssignedTo, defect => defect.Summary)

47
Q

استفاده از
Task<>
و
async , await
در متود های سی شارپ برای چیست؟

A

وقتی یک ریکوئست به سرور از طریق این متود از جنس
Task<>
ارسال می کنیم و سرور در حال لود دیتای ما هست، سرور مسدود نشود و ریکوئست های دیگر هم بتوانند به سرور ارسال شوند.
public async Task<ActionResult<IEnumerable<Mission>>> GetMissions()
{
var missions = await _context.Missions.ToListAsync(); // عملیات غیرهمزمان برای خواندن داده‌ها از پایگاه داده
return Ok(missions); // بازگشت پاسخ موفقیت‌آمیز با داده‌ها
}</Mission>

48
Q

استفاده از
ActionResult
در متودهای سی شارپ برای چیست؟

A

برای اینکه
status
های مختلف
HTTP Methods
رو بر گردونیم.
مثل
200 ok
404 Not Found

49
Q

ارسال اطلاعات از کنترلر به ویو چگونه انجام می شود؟

A

برای ارسال اطلاعات از کنترلر به ویو دو تا راه داریم:
1- ViewBag
var person = createperson();
@ViewBag.person = person;
2- ViewData
@ViewData[“address”] = “solaleh.com”