Is linq iteration required for a single line?

when i form the following code

Rabbit[] rbt=
new Rabbit[]
{
   new Rabbit{ Name="Jobby", Vegetable=new Vegetable{ VegiName="carrot"}},
   new Rabbit{ Name="hobby", Vegetable=new Vegetable{ VegiName="Beetroot"}}
};

var s = from bt in rbt where
        bt.Vegetable.VegiName.CompareTo("carrot") == 0 select bt;

foreach (var v in s)
{
                Console.WriteLine("{0}{1}",v.Vegetable.VegiName,v.Name);
}

my query returns only one row, then why do I need a foreach iteration? i can't use

Console.WriteLine("{0}{1}",s.Vegetable.VegiName,s.Name); directly ?
+3
source share
4 answers

How should the compiler know that your request will return only one line? Suppose you change your data to include another carrot or no carrot at all - what would you expect.

, Single, . , First. , FirstOrDefault. , SingleOrDefault. , :

var s = from bt in rbt where
        bt.Vegetable.VegiName.CompareTo("carrot") == 0 select bt;

var veg = s.Single();

Console.WriteLine("{0}{1}",veg.Vegetable.VegiName,veg.Name);

, :

var veg = rbt.Where(bt => bt.Vegetable.VegiName.CompareTo("carrot") == 0)
             .Single();
Console.WriteLine("{0}{1}",veg.Vegetable.VegiName,veg.Name);
+8

IEnumerable<Rabbit>, Rabbit. , , FirstOrDefault() SingleOrDefault() .

var s = (from bt in rbt
         where bt.Vegetable.VegiName.CompareTo("carrot") == 0
         select bt)
        .FirstOrDefault();
+2

Single method . SingleOrDefault, , (.. ).

Rabbit result = s.SingleOrDefault();

if (result != null)
{
    // use result
    Console.WriteLine("{0} : {1}", result.Vegetable.VegiName, result.Name);
}

, First FirstOrDefault , .

+1

No, because LINQ does not know at compile time that s will return only one line. Use the First () or Single () operator:

var v = (from bt in rbt where
         bt.Vegetable.VegiName.CompareTo("carrot") == 0 
         select bt)
        .First();
+1
source

Source: https://habr.com/ru/post/1720408/


All Articles