LINQ 命名规范 - Lambda 表达式

12

通常我们为所有 C# 语法遵循编码/命名标准。例如,如果我们在方法内部声明字符串,我们使用作用域-数据类型-字段名称的格式。(lstrPersonName)

List<Person> icolPerson;
private LoadPersonName()
{
   string lstrPersonaName;
}

我在思考如何遵循Lambda表达式的命名标准,特别是当我们为func委托定义参数时使用缩写名称(例如x)。

var lobjPerson = icolPerson.Where(x => x.person_id = 100)

如果您查看上面的代码行,X并没有遵循任何标准。我也读到一个lambda表达式的目的是减少冗长的代码。

我在这里寻求帮助以获取正确的命名规范。

var lobjPerson = icolPerson.Where(x => x.person_id = 100)

或者

var lobjPerson = icolPerson.Where(lobjPerson => lobjPerson .person_id = 100)
8个回答

14

我的lambda表达式使用单个字母参数,通常是参数名称的第一个字母:

  • buttons.Select(b => b.Text);

  • services.Select(s => s.Type);

但有时为了更清晰或消除两个参数之间的歧义,我会添加几个字母。

而当我使用的东西没有太多具体意义时,使用 xy

  • values.Aggregate((x, y) => x + y);

总之,我在编写lambda表达式时遵循短小精悍的原则,表达能力其次,因为上下文往往可以帮助理解事物(例如第一个示例中很明显 b 代表按钮)。


11

我曾经大量使用VBScript(ASP)进行编程,在那里使用匈牙利标记以跟踪数据类型对于保持理智非常关键。在像C#这样的类型安全语言中,我发现完全没有必要使用匈牙利标记。

描述性的变量名在代码可读性方面做得很好,但它并不总是需要描述变量的每个方面。例如,类似persons的名称表示它是一个人对象的集合,它是List<Person>还是IEnumerable<Person>通常并不重要来理解代码正在做什么,如果您试图完全错误地执行操作,则编译器会立即提示您。

我经常使用单个字母的变量名称,其中变量的范围非常有限。例如,在小循环或lambda表达式中使用的i索引变量。


4

通常我只使用正在查询的类型的首字母,因此在您的情况下,由于它是Person类型,我会这样做:

var lobjPerson = icolPerson.Where(p => p.person_id = 100);

如果它是类型 Car 的另一个示例,我会这样做:
var lobjCar = icolCar.Where(c => c.car_id = 100);

我这样做是为了快捷,不过我认为在查询中使用全名即car => car.car_id也没有任何问题。


2
我认为你使用的命名标准(匈牙利命名法)是在没有高级工具(如Visual Studio)的时候必要的。今天,您有像Intellisense这样的技术,它会在您键入时告诉您大多数变量错误,例如将int分配给string。因此,从今天开始,它不再是良好编码约定或标准的独家部分,就像过去一样。现在,大多数人都遵循帕斯卡大小写或驼峰大小写。如果有人使用它,我认为这更多是出于个人喜好。
话虽如此,根据您编写和命名变量的方式,您应该采用第二种方法。同样,这取决于您个人的偏好。
PS:这条评论并不意味着我看不起您使用匈牙利命名法。 :)

1

并没有一种准确的方法。命名标准像其它编码规范(例如表达式后/前加空格和新行)是小组内部通用的约定。所以只需按照你喜欢的方式和公司应当的方式编写代码即可。但需要保持一致性!

我更倾向于在私有字段的名称中使用下划线前缀。但是你的风格(可见性+类型+名称)对我来说就像一个旧的WInAPI 代码引用(匈牙利表示法)=)。


0

LINQ 不仅适用于曾经为数据库编写查询的开发人员,也适用于函数式程序员。

因此,如果您对 SQL 类型的查询不太熟悉,不要担心,我们有一个非常好的选项叫做“Lambda 表达式”。

在这里,我将用一个小例子演示两个选项的情况。这个例子有一个整数数组,我只使用 LINQ 的威力检索偶数。

我们开始吧

using System;
using System.Collections.Generic;
using System.Text;
using System.Query;
using System.Xml.XLinq;
using System.Data.DLinq;

namespace LINQConsoleApplication1
{

class Program
{
    static void Main(string[] args)
    {
        int[] arrInt = {1,2,3,4,5,6,7,8,9,10};

        #region Place to change

        //Language Integrated Query

        var aa = from s in arrInt

                 where s % 2 == 0
                 select s;

        #endregion

        foreach (var item in aa)
        {
            Console.WriteLine("{0}", item);
        }

        Console.ReadKey();

    }

}

}

如果您不想使用查询的不同方法来处理语言,则可以自由地使用 Lambda 表达式。

因此,只需将 #region 区域替换为以下代码块,结果将是相同的。

        #region Place to change

        //Lambda Expression

        var aa = arrInt.Where(s => s % 2 == 0);

        #endregion

0
只要你的lambda表达式只有一个语句,我会尽可能将变量名保持简短。命名的总体目的是使代码易读,在这些情况下,方法名和一般上下文应该足够。
你不必一直使用x。对于Person对象,我倾向于使用p。
如果您需要编写涉及大括号和分号的更复杂的表达式,则我认为所有常规命名规则都适用。

0
如果你的集合叫做 something-persons,那么当你使用 persons.Where(p => p.Whatever) 时,很明显 p 就是一个 person。如果你的 lambda 表达式太复杂,无论你使用的参数是什么,都不容易立刻理解,那么你就不应该使用 lambda 表达式,或者将它们变得简单易懂。
至于你的其他约定,为什么要使用匈牙利命名法来声明 personName 是一个字符串呢?姓名很明显是一个字符串。而且为什么需要前缀来提醒你一个变量是局部的呢?它的声明必须在同一个方法中,所以你不可能忘记它。如果你忘记了,那么你的方法可能太长或太复杂了。
只要让你的标识符适当地描述变量的含义,那么其他的就会很明显了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接