تفاوت میان First و FirstOrDefault و Single و SingleOrDefault و Last و LastOrDefault


همه این 6 متدها یک مقدار از یک توالی را برمیگردانند و می توانند با predicate یا بدون predicate باشد.

First:

اولین عنصر از یک توالی یا اولین عنصر را که توسط predicate برابر باشد، بر میگرداند.

اگر در یک توالی هیچ عنصری وجود نداشته باشد از InvalidOperationException خوانده میشود و پیام : "Sequence contains no elemts" به کاربر نمایش داده می شود.

اگر نوع predicate با یکی از عناصر توالی برابر نباشد در این صورت باز InvalidOperationException فراخوانی شده و پیام "Sequence contains no matching element" نمایش داده می شود.

// Returns &quota&quot:
 new[] { &quota&quot }.First();  

// Returns &quota&quot:
 new[] { &quota&quot, &quotb&quot }.First(); 

 // Returns &quotb&quot: 
new[] { &quota&quot, &quotb&quot }.First(x => x.Equals(&quotb&quot));  

// Returns &quotba&quot: 
new[] { &quotba&quot, &quotbe&quot }.First(x => x.Contains(&quotb&quot));  

// Throws InvalidOperationException: 
new[] { &quotca&quot, &quotce&quot }.First(x => x.Contains(&quotb&quot));  

// Throws InvalidOperationException:
 new string[0].First();

FirstOrDefault:

اولین عنصر از توالی یا اولین عنصری که برابر باشد predicate را برمیگرداند.

اگر مقدار predicate برابر نباشد یا هیچ عنصری در توالی نباشد در این صورت مقدار default(T) را بر میگرداند.

// Returns &quota&quot:
new[] { &quota&quot }.FirstOrDefault();

// Returns &quota&quot:
new[] { &quota&quot, &quotb&quot }.FirstOrDefault();

// Returns &quotb&quot:
new[] { &quota&quot, &quotb&quot }.FirstOrDefault(x => x.Equals(&quotb&quot));

// Returns &quotba&quot:
new[] { &quotba&quot, &quotbe&quot }.FirstOrDefault(x => x.Contains(&quotb&quot));

// Returns null:
new[] { &quotca&quot, &quotce&quot }.FirstOrDefault(x => x.Contains(&quotb&quot));

// Returns null:
new string[0].FirstOrDefault();

Last:

آخرین عنصر موجود در توالی یا آخرین عنصری که در predicateبرابر باشد را برمیگرداند.

اگر هیچ عنصری در توالی موجود نبود "InvalidOperationException" فراخوانی و پیام "Sequence contains no elemets" نمایش داده می شود.

اگر هیچ عنصری وجود نداشت که برابر با مقدار predicate باشد باز "InvalidOperationException" و پیام "Sequence contains no matching element" نمایش داده می شود.

// Returns &quota&quot:
 new[] { &quota&quot }.Last();  

// Returns &quotb&quot:
 new[] { &quota&quot, &quotb&quot }.Last();  

// Returns &quota&quot: 
new[] { &quota&quot, &quotb&quot }.Last(x => x.Equals(&quota&quot));  

// Returns &quotbe&quot: 
new[] { &quotba&quot, &quotbe&quot }.Last(x => x.Contains(&quotb&quot)); 

 // Throws InvalidOperationException: 
new[] { &quotca&quot, &quotce&quot }.Last(x => x.Contains(&quotb&quot));  

// Throws InvalidOperationException:
 new string[0].Last();

LasrOrDefault:

این متد همانند FirsrOrDefault می باشد اما برخلاف First که اولین را برمیگرداند این متد آخرین را برمیگرداند.

// Returns &quota&quot:
new[] { &quota&quot }.LastOrDefault();

// Returns &quotb&quot:
new[] { &quota&quot, &quotb&quot }.LastOrDefault();

// Returns &quota&quot:
new[] { &quota&quot, &quotb&quot }.LastOrDefault(x => x.Equals(&quota&quot));

// Returns &quotbe&quot:
new[] { &quotba&quot, &quotbe&quot }.LastOrDefault(x => x.Contains(&quotb&quot));

// Returns null:
new[] { &quotca&quot, &quotce&quot }.LastOrDefault(x => x.Contains(&quotb&quot));

// Returns null:
new string[0].LastOrDefault();

Single:

اگر در توالی دقیقا یک عنصر وجود داشت یا مقدار predicate دقیقا برابر با یک عنصر از توالی باشد در آن صورت آن عنصر را برمیگرداند.

اگر در توالی هیچ عنصری وجود نداشت یا هیچ عنصری برابر با مقدار predicate نبود در ان صورت "InvalidOperationException" فراخونی و پیام "Sequence contains no elements" نمایش داده می شود.

اگر در توالی بیش از یک عنصر باشد یا مقدار predicate بیش از یک عنصر را انتخاب کند "InvalidOperationException" فراخوانی و پیام "Sequence contains more than one element" نمایش داده می شود.

// Returns &quota&quot:
new[] { &quota&quot }.Single();

// Throws InvalidOperationException because sequence contains more than one element:
new[] { &quota&quot, &quotb&quot }.Single();

// Returns &quotb&quot:
new[] { &quota&quot, &quotb&quot }.Single(x => x.Equals(&quotb&quot));

// Throws InvalidOperationException:
new[] { &quota&quot, &quotb&quot }.Single(x => x.Equals(&quotc&quot));

// Throws InvalidOperationException:
new string[0].Single();

// Throws InvalidOperationException because sequence contains more than one element:
new[] { &quota&quot, &quota&quot }.Single();

SingleOrDefault:

اگر در توالی دقیقا یک عنصر وجود داشت یا مقدار predicate دقیقا برابر با یک عنصر از توالی باشد در آن صورت همان عنصر را برمیگرداند.

اگر در توالی هیچ عنصری وجود نداشت یا هیچ عنصری برابر با مقدار predicate نبود در آن صورت Default(T) برگشت داده می شود.

اگر در توالی بیش از یک عنصر باشد یا مقدار predicate بیش از یک عنصر را انتخاب کند "InvalidOperationException" فراخوانی و پیام "Sequence contains more than one element" نمایش داده می شود.

// Returns &quota&quot:
new[] { &quota&quot }.SingleOrDefault();

// returns &quota&quot
new[] { &quota&quot, &quotb&quot }.SingleOrDefault(x => x == &quota&quot);

// Returns null:
new[] { &quota&quot, &quotb&quot }.SingleOrDefault(x => x == &quotc&quot);

// Throws InvalidOperationException:
new[] { &quota&quot, &quota&quot }.SingleOrDefault(x => x == &quota&quot);

// Throws InvalidOperationException:
new[] { &quota&quot, &quotb&quot }.SingleOrDefault();

// Returns null:
new string[0].SingleOrDefault();