一天的美好时光!
我正在尝试传递几个继承自一个基类的类
结构如下:
我无法弄清楚的是,如何将多个权限传递给此函数并检查是否已添加权限。我想的是允许类似下面的方法调用:
AddDefaultPermissions(Edit, Delete, Create);
权限类:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
public class Permission {
private int permissionID;
private string permissionName;
private string permissionDescription;
private int accessStartTimestamp;
private int accessEndTimestamp;
public int PermissionID {
get { return permissionID; }
set { permissionID = value; }
}
public string PermissionName {
get { return permissionName; }
set { permissionName = value; }
}
public string PermissionDescription {
get { return permissionDescription; }
set { permissionDescription = value; }
}
public int AccessStartTimestamp {
get { return accessStartTimestamp; }
set { accessStartTimestamp = value; }
}
public int AccessEndTimestamp {
get { return accessEndTimestamp; }
set { accessEndTimestamp = value; }
}
}
编辑课程:
using System;
using System.Collections;
using System.Collections.Generic;
public class Edit : Permission {
public Edit() {
PermissionID = 1;
PermissionName = "Edit";
PermissionDescription = "Allow user to edit records";
AccessStartTimestamp = 1488369600;
AccessEndTimestamp = 1491048000;
}
}
要检查权限是否已存在,可以使用PermissionID变量。此变量由所有权限类继承,并且对于权限是唯一的(Edit = 1,Create = 2,Delete = 3);
我在LINQ中看到了一些示例,但无法使其工作,因为实际上从未使用过LINQ。 是否可以实现此功能+以检查是否已添加权限以避免重复?
答案 0 :(得分:2)
您可以使用params
语法传递任意数量的权限:
AddDefaultPermissions(params Permission[] permissions) {
}
要检查多次使用哪个权限,请分组和检查计数:
foreach (var pg in permissions.GroupBy(p => p).Where(g => g.Count() > 1) {
Console.WriteLine("Permission {0} is used {1} times.", pg.Key, pg.Count());
}
重要提示:仅当Permission
类正确实施Equals
和GetHashCode
方法时,上述内容才有效。
答案 1 :(得分:2)
您可以使用Distinct
轻松删除输入中的重复项:
AddDefaultPermissions(params Permission[] permissions)
{
var actualPermissions = permissions.Distinct();
}
这假定您的Permission
- 类通过比较Equals
- 属性来适当地实现GetHashCoe
和PermissionID
,例如:
class Permission
{
public override bool Equals(object obj)
{
var p = obj as Permission;
if(p == null) return false;
return this.PermissionID == p.PermissionID;
}
public override int GetHashCode()
{
return this.PermissionID .GetHashCode();
}
}
如果您无法更改此课程的实施,您还可以在IEqualityComparer
中使用自己的Distinct
实施:
var actualPermissions = permissions.Distinct(myEqualityComparer);
如果您只想查看该项目是否已全部添加,您只需检查Contains
是否依赖Equals
实施,如上所示:
AddDefaultPermissions(params Permission[] permissions)
{
var actualPermissions = permissions.Distinct();
foreach(var p in permissions)
if(!listOfAllreadyAddedPermissions.Contains(p)
listOfAllreadyAddedPermissions.Add(p);
}
或者反过来 - 如果你不想改变课程 - 请使用Any
:
if(!listOfAllreadyAddedPermissions.Any(x => x.PermissionId == p.PermissionId)
listOfAllreadyAddedPermissions.Add(p);