C# 解释代理如何在以下代码中工作?
我很好奇下面的代码是如何工作的,尤其是包含委托内容的部分,因为我是新手。此外,代码中是否存在任何瓶颈,例如,使用SortedDictionary会比使用列表然后使用LINQ对其进行排序更好吗?好的,代码如下:C# 解释代理如何在以下代码中工作?,c#,.net,delegates,C#,.net,Delegates,我很好奇下面的代码是如何工作的,尤其是包含委托内容的部分,因为我是新手。此外,代码中是否存在任何瓶颈,例如,使用SortedDictionary会比使用列表然后使用LINQ对其进行排序更好吗?好的,代码如下: public class ColorManager { private List<ColorData> colorCodes = new List<ColorData>(); public List<ColorData> ColorCo
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
)的列表。到目前为止很简单。那么meatierFillData
方法呢
首先,我们将循环此表中的每一行:
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
)的列表。到目前为止很简单。那么meatierFillData
方法呢
首先,我们将循环此表中的每一行:
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++;
}
}
请注意