我如何使用字典来满足我的要求?
本文关键字:我的 满足 何使用 字典 | 更新日期: 2023-09-27 18:07:58
嗨,我有一个要求,如选择多个值,然后删除。我将有一些EMployee IDs
以及Dates
和PayID
值的列表。
我将得到多个字段。现在我想将其添加到字典元素中,例如对于特定的EmpID
,我必须将Date and PayID
分配为键。
我想这样写
public struct MyValue
{
public List<int> lst;
public List<int> lst1;
public List<DateTime> lstdt;
}
public class MyDictionary : Dictionary<int, MyValue>
{
public void Add(int key, List<int> lst1, List<int> lst2, List<DateTime> lstDt1)
{
MyValue v1=new MyValue();
v1.lst = lst1;
v1.lst1 = lst2;
v1.lstdt = lstDt1;
this.Add(key, v1);
}
}
但是我在处理这个问题时有点困惑,所以有人能给我一个想法来实现我的要求吗?
这是我的要求,如果我将EmpID
设置为1
,那么我将Multiple PayIDs and Dates
设置为1 and System Date
。
即使我将得到多个EmpIDs
,但如果已经存在于字典中作为Key
元素,我不想再添加它。
(使用2.0框架)
我该怎么做?
这就是我在做什么,我将有一个网格与复选框删除记录。gridview
包含EmpID
、PayID
和Date
现在,如果用户选择了一些多个复选框并试图删除,我想将值存储到Dictionary
。我将从选择中获得多个EmpID
,其中相同的EmpID
可能存在多次。所以我需要做的是,我想将相应的值存储到Dictionary
, EmpID
作为Key
值,Values
作为字典的倍数,这将是PayID and Date
。
我的Gridview
结构示例
Chkbox EmpID PayID Date
chk 123 1 8-31-2011
chk 123 2 10-31-2011
chk 1234 1 18-31-2011
chk 1234 1 19-31-2011
EmpID
123
我想分配1,2 and the 2 dates
作为值
为什么不创建一个包含所有员工信息的employee类型呢?
public class Employee
{
List1<>()
List2<>()
List3<>()
}
然后有一个像这样的字典:
Dictionary<int, Employee>();
你可以在字典中使用字典
,
Dictionary<int, Dictionary<int, DateTime>> dict = new Dictionary<int, Dictionary<int, DateTime>>();
与
相关Dictionary<EmpID, Dictionary<PayID, Date>>
因此,要获取员工的特定工资ID的日期,将为
Dictionary<int, Dictionary<int, DateTime>> dict = new Dictionary<int, Dictionary<int, DateTime>>();
int EmpID = 1;
int PayRateID = 2;
DateTime date = dict[EmpID][PayRateID];
显然你需要先检查Values是否存在于字典中
我的建议是,
class Employee
{
public int EmployeeID {get;set;}
public DateTime Date {get;set;}
public int PayID {get;set;}
}
class MyDictionary
{
private static Dictionary<int, List<Employee>> dict = new Dictionary<int, List<Employee>>();
public static void Add(Employee obj)
{
if (dict.ContainsKey(obj.EmployeeID))
{
dict[obj.EmployeeID].Add(obj);
}
else
{
dict.Add(obj.EmployeeID, new List<Employee>() {obj });
}
}
public static List<Employee> GetEmps(int key)
{
if (dict.ContainsKey(key))
return dict[key];
return null;
}
}
可以遍历字典或搜索员工
MyDictionary.Add(new Employee() { EmployeeID = 1, PayID = 1 });
MyDictionary.Add(new Employee() { EmployeeID = 1, PayID = 2 });
MyDictionary.Add(new Employee() { EmployeeID = 2, PayID = 3 });
MyDictionary.Add(new Employee() { EmployeeID = 3, PayID = 1 });
foreach (Employee e in MyDictionary.GetEmps(1))
Console.WriteLine(e.EmployeeID + " " + e.PayID);
如果您想要找到要删除的行,那么最好创建代表整行的MyValue。请记住,Dictionary不允许多次添加一个键。此外,如果您想找到行,那么您不需要将它们的值存储在不同的列表中,因为您很容易丢失哪个列表中的哪个值对应于哪个行。因此,最好以这样的方式存储要删除的行:
Dictionary<int, List<MyValue>> rowsToBeDeleted = new Dictionary<int, List<MyValue>> ();
class MyValue
{
int EmpID;
int PayID;
DateTime Date;
}
rowsToBeDeleted.Add(123, new List<MyValue>);
rowsToBeDeleted[123].Add(123, 1, new DateTime(2011,8,31);
rowsToBeDeleted[123].Add(123, 2, new DateTime(2011,10,31);
rowsToBeDeleted.Add(1234, new List<MyValue>);
rowsToBeDeleted[1234].Add(1234, 1, new DateTime(2011,18,31); // month #18 - wow!
rowsToBeDeleted[1234].Add(1234, 2, new DateTime(2011,19,31);
现在,您可以使用EmployeeID作为键来查找要删除的行列表。
关于使用EmployeeID一次的经济性。当使用Dictionary<int, MyValue>
时,您理所当然地拥有KeyValuePair<int, MyValue>
,因为Dictionary实际上是KeyValuePair结构的集合。因此,如果你不想在类中创建新类型或存储另一个int值,可以尝试使用它。
然而,我认为将int添加到MyValue中并不是什么大问题-对主集合进行一些反向引用总是有用的,并且与指针类型相比,int相当小。但是,您将更方便地使用MyValues,而不是到处传递KeyValuePairs或MyValue + int。
谁知道这是怎么回事?
arrEmpID.Add(1);
arrEmpID.Add(1);
arrEmpID.Add(2);
arrEmpID.Add(2);
arrPay.Add(1);
arrPay.Add(1);
arrPay.Add(2);
arrPay.Add(2);
DateTime dt = DateTime.Now;
DateTime dt1 = DateTime.Now.AddMinutes(1);
DateTime dt2 = DateTime.Now.AddMinutes(1);
DateTime dt3 = DateTime.Now.AddMinutes(1);
arrPayID.Add(dt);
arrPayID.Add(dt1);
arrPayID.Add(dt2);
arrPayID.Add(dt3);
EmpIDs = (int[])arrEmpID.ToArray(typeof(int));
Dates = (DateTime[])arrPayID.ToArray(typeof(DateTime));
PayIDs = (int[])arrPay.ToArray(typeof(int));
for (int i = 0; i < EmpIDs.Length; i++)
{
if (!(d.ContainsKey(EmpIDs[i])))
{
List<int> values = new List<int>();
List<DateTime> ldt = new List<DateTime>();
d.Add(EmpIDs[i], values, ldt);
}
d[EmpIDs[i]].lst.Add(PayIDs[i]);
d[EmpIDs[i]].lstdt.Add(Dates[i]);
}
foreach (int EmpID in d.Keys)
{
foreach (int pID in d[EmpID].lst) // I just missed out this values
{
sb.Append(pID);
sb.AppendLine(" ");
}
foreach (DateTime dtTimes in d[EmpID].lstdt) // I just missed out this values
{
sb1.Append(dtTimes.ToString("MMddyyyy"));
sb1.AppendLine(" ");
}
}
Label1.Text = sb.ToString();
Label2.Text = sb1.ToString();
我的字典如下
public struct MyValue
{
public List<int> lst;
public List<DateTime> lstdt;
}
public class MyDictionary : Dictionary<int, MyValue>
{
public void Add(int key, List<int> lst1, List<DateTime> lstDt1)
{
MyValue v1 = new MyValue();
v1.lst = lst1;
v1.lstdt = lstDt1;
this.Add(key, v1);
}
}