C# 解释代理如何在以下代码中工作?

C# 解释代理如何在以下代码中工作?,c#,.net,delegates,C#,.net,Delegates,我很好奇下面的代码是如何工作的,尤其是包含委托内容的部分,因为我是新手。此外,代码中是否存在任何瓶颈,例如,使用SortedDictionary会比使用列表然后使用LINQ对其进行排序更好吗?好的,代码如下: public class ColorManager { private List<ColorData> colorCodes = new List<ColorData>(); public List<ColorData> ColorCo

我很好奇下面的代码是如何工作的,尤其是包含委托内容的部分,因为我是新手。此外,代码中是否存在任何瓶颈,例如,使用SortedDictionary会比使用列表然后使用LINQ对其进行排序更好吗?好的,代码如下:

public class ColorManager
{
    private List<ColorData> colorCodes = new List<ColorData>();

    public List<ColorData> ColorCodes
    {
        get
        {
            var sortList = from a in this.colorCodes
                           orderby a.colorCode ascending
                           select a;

            return sortList.ToList();
        }
    }

    public void FillData(DataTable table)
    {
        for(int row = 0; row < table.Rows.Count; row++)
        {
            ColorData cData = new ColorData();
            string name = table.Rows[row]["Color"].ToString().Trim();

            if(!this.colorCodes.Exists(
                delegate(ColorData e)
                {
                    return e.ColorCode == name;
                }))
            {
                cData.Add(table.Rows[row]["Color"].ToString());
                this.colorCodes.Add(cData);
            }
            else
            {
                this.colorCodes.Find(
                    delegate(ColorData e)
                    {
                        return e.ColorCode == name;
                    }).Count++;
            }
        } 
    }
}
        if(!this.colorCodes.Exists(
            delegate(ColorData e)
            {
                return e.ColorCode == name;
            }))
公共类颜色管理器
{
私有列表颜色代码=新列表();
公共列表颜色代码
{
得到
{
var sortList=来自this.colorCodes中的a
orderby a.colorCode升序
选择一个;
return sortList.ToList();
}
}
公共void FillData(数据表)
{
for(int row=0;row
它是一个匿名委托,用作find表达式的选择标准。换句话说,如果颜色等于名称给定的颜色,它将返回true,Find将把它添加到生成的IEnumerable中。如果返回false,Find将不包含它。它可以更简洁地写成

p => p.ColorCode == name

它是一个匿名委托,用作find表达式的选择条件。换句话说,如果颜色等于名称给定的颜色,它将返回true,Find将把它添加到生成的IEnumerable中。如果返回false,Find将不包含它。它可以更简洁地写成

p => p.ColorCode == name

Exists和Find是泛型扩展方法。它们用于集合中每个项上的每个循环。向委托传递一个参数(定义类似“(ColorData e)”),并返回一个布尔值。

Exists和Find是通用扩展方法。它们用于集合中每个项上的每个循环。向委托传递一个参数(定义如“(ColorData e)”),并返回一个布尔值。

委托:

本例中的委托正在实现Func方法。基本上,您正在做的是动态创建一个方法,该方法接受ColorData参数并返回bool

这允许您对IEnumerable集合的每个成员执行Exists()和Find()调用,以进行检查和筛选

至于分类词典:

如果这是您唯一使用它的地方,您最好使用SortedDictionary,因为您不会经常使用它。现在,每次你打电话给色码你都在求助。一个分类词典将不断地被分类。

代表:

本例中的委托正在实现Func方法。基本上,您正在做的是动态创建一个方法,该方法接受ColorData参数并返回bool

这允许您对IEnumerable集合的每个成员执行Exists()和Find()调用,以进行检查和筛选

至于分类词典:

如果这是您唯一使用它的地方,您最好使用SortedDictionary,因为您不会经常使用它。现在,每次你打电话给色码你都在求助。一个分类词典将不断地被分类

我很好奇下面的代码是如何工作的,尤其是包含委托内容的部分,因为我是新手

首先看一下这个
ColorCodes
属性访问器:

        var sortList = from a in this.colorCodes
                       orderby a.colorCode ascending
                       select a;
它以升序(
…orderby a.colorCode升序
)返回所有颜色代码(
this.colorCodes
)的列表。到目前为止很简单。那么meatier
FillData
方法呢

首先,我们将循环此表中的每一行:

    for(int row = 0; row < table.Rows.Count; row++)
    {
如果该列在我们的颜色代码列表中没有匹配项,则此
If
条件为真。
Exists
方法接受一个返回布尔值的单参数函数,这就是这个匿名委托:一个返回布尔值(
e.ColorCode==name
)的单参数(
ColorData e
)函数。它被否定(
!this.[…]
),因此如果找到匹配项,则条件为false

        if(!this.colorCodes.Exists(
            delegate(ColorData e)
            {
                return e.ColorCode == name;
            }))
        {
            cData.Add(table.Rows[row]["Color"].ToString());
            this.colorCodes.Add(cData);
        }
否则,如果存在匹配项,请使用另一个匿名代理查找该名称,并将其添加到该颜色的项目计数中

        else
        {
            this.colorCodes.Find(
                delegate(ColorData e)
                {
                    return e.ColorCode == name;
                }).Count++;
        }
    } 
请注意,这段代码有点低效,因为两个不同的匿名委托实际上做相同的事情,可以共享

我很好奇下面的代码是如何工作的,尤其是包含委托内容的部分,因为我是新手

首先看一下这个
ColorCodes
属性访问器:

        var sortList = from a in this.colorCodes
                       orderby a.colorCode ascending
                       select a;
它以升序(
…orderby a.colorCode升序
)返回所有颜色代码(
this.colorCodes
)的列表。到目前为止很简单。那么meatier
FillData
方法呢

首先,我们将循环此表中的每一行:

    for(int row = 0; row < table.Rows.Count; row++)
    {
如果该列在我们的颜色代码列表中没有匹配项,则此
If
条件为真。
Exists
方法接受一个返回布尔值的单参数函数,这就是这个匿名委托:一个返回布尔值(
e.ColorCode==name
)的单参数(
ColorData e
)函数。它被否定(
!this.[…]
),因此如果找到匹配项,则条件为false

        if(!this.colorCodes.Exists(
            delegate(ColorData e)
            {
                return e.ColorCode == name;
            }))
        {
            cData.Add(table.Rows[row]["Color"].ToString());
            this.colorCodes.Add(cData);
        }
否则,如果存在匹配项,请使用另一个匿名代理查找该名称,并将其添加到该颜色的项目计数中

        else
        {
            this.colorCodes.Find(
                delegate(ColorData e)
                {
                    return e.ColorCode == name;
                }).Count++;
        }
    } 
请注意