C# 使用查询或代码

C# 使用查询或代码,c#,.net,C#,.net,我一直在阅读有关.NETC中的查询、lambda和编码的内容。到目前为止,我正在编写没有查询和lambda的代码,但每次使用列表时,我至少可以用三种不同的方式编写查询 在经典编程中,通过查询/lambda或循环从列表和数组中检索数据更可取吗 查询示例: int searchedNumber = 5; int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9 ,0}; var result = from n in numbers

我一直在阅读有关.NETC中的查询、lambda和编码的内容。到目前为止,我正在编写没有查询和lambda的代码,但每次使用列表时,我至少可以用三种不同的方式编写查询

在经典编程中,通过查询/lambda或循环从列表和数组中检索数据更可取吗

查询示例:

int searchedNumber = 5;
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9 ,0};

var result = from n in numbers
                             where n == searchedNumber
                             select n;
或者一个循环。例如:

int searchedNumber = 5;
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int result = 0;

foreach(int n in numbers)
{
     if(searchedNumber == n)
     {
          result = n;
          break;
     }
}

选择是你的,但你应该考虑两件事。

第一:支持可读性。无论你或你的团队认为可读和容易处理的一个快速浏览是好的。如果您都能更轻松地处理查询语法,请坚持这一点。如果你们都喜欢方法语法,就用它吧!如果你们都讨厌LINQ,手动循环

第二:保持一致。如果样式在同一个类中更改了30次,那么上面这一点是无用的。挑一个,坚持下去

除此之外:如果你真的感觉自己是过早的优化,那么你可以考虑用LAMBDAS和LINQ查询来进行额外的对象分配,并支持手动循环。


只有当您真正关心少量的额外内存分配时,您才应该关心,如果您已经分析了代码并且能够证明这是一个问题。

lambda很好,但是当它们变得复杂时,最好将它们与clasic循环语句混合使用

在你的例子中,我会写:

numbers.FirstOrDefault(number => number == searchedNumber);
如你所见,我更喜欢流畅风格的linq。 但如果对你来说,更清楚的是 从数字中的n开始,其中n==searchedNumber选择n; 为什么不呢

但是


它不是很优雅,代码也不是那么可读——所以您可以考虑使用经典循环语句。

我假设searchedNumber实际上是一个参数,或者至少是可变的,而不是定义的常量值

在示例中,第一个是必须的。原因是0在可能的数字列表中,因此如果searchedNumber==0,将其用作幻数将无法可靠地工作。select语句返回一个IEnumerable,这样您就可以区分是否使用任何


如上所述,尽管您将使用Contains或Any和谓词来确定容器是否包含您的值

首先,我同意史蒂夫的上述评论。但是,因为这似乎是一个“新手”问题

解决方案2通常会导致“选择”逻辑与“业务”逻辑混合。例如:

//int searchedNumber = 5;
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
//int result = 0;

foreach(int n in numbers)
{
     if(n < y)
     {
          DoX(n);
     }
     else if(n > y)
     {
         DoY(n);
     }
     else
     {
         DoZ(n);
     }
}
然后,您可以更改选择逻辑,或者将一个分组拆分为两个。。。我发现你可能会迷失在循环中

相反,这个怎么样:

int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9 ,0};

// selection logic
var group1 = from n in numbers
             where n < y
             select n;

var group2 = from n in numbers
             where n > y
             select n;

// business logic
foreach(var i in group1)
    DoX(i);

foreach(var i in group2)
    DoY(i);
这种“风格”编码的优点在于: 1.如果更改选择逻辑,则不必触摸业务逻辑代码,反之亦然 2.您可以清楚地看到什么条件构成DoX、DoY等的成员资格


这类似于异步编程,其中有“任务”和“完成”。它不仅效率高,而且保持了明确的领域分离。

谁更喜欢?有很多方法可以完成同样的任务。只要代码清晰、简洁,并按需要执行,如果不是个人喜好的话,有什么区别?最好是含糊不清的。为了表现更好,为了阅读更清晰,为了项目负责人更容易思考?请解释。无论你做什么。。。保持一致。没有什么比查看混合样式的代码库更糟糕的了;请注意,您的两个实现没有使用samebool=number.Contains5;这个代码没有那么糟糕。它总是计算所有三个布尔值,这是低效的,它覆盖了visit变量,这可能会让人困惑,但其余的是可以理解的。理解等效的基于循环的代码需要同样的时间。我也认为这是相当理解的,但我的观点是——如果你的linq变得太复杂,试着将它分成几部分或用代码替换其中的一些部分。例如-如果您有main.ForEach。。对每个元素进行linq操作,最好将main.ForEach改为ForEach{。。。
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9 ,0};

// selection logic
var group1 = from n in numbers
             where n < y
             select n;

var group2 = from n in numbers
             where n > y
             select n;

// business logic
foreach(var i in group1)
    DoX(i);

foreach(var i in group2)
    DoY(i);