Как я могу использовать словарь для моего требования? - PullRequest
0 голосов
/ 09 сентября 2011

Привет всем У меня есть требование, как выбор нескольких значений, а затем удалить. У меня будет список 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.

Даже я получу Mutilple 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 в качестве значений

Ответы [ 5 ]

0 голосов
/ 09 сентября 2011

Может кто-нибудь сказать, что не так в этом

   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);
    }
}
0 голосов
/ 09 сентября 2011

Вы можете использовать словарь в словаре.

например:

Dictionary<int, Dictionary<int, DateTime>> dict = new Dictionary<int, Dictionary<int, DateTime>>();

, что относится к

Dictionary<EmpID, Dictionary<PayID, Date>>

Таким образом, чтобы получить день определенногоИдентификатор оплаты сотрудника будет

    Dictionary<int, Dictionary<int, DateTime>> dict = new Dictionary<int, Dictionary<int, DateTime>>();

    int EmpID = 1;
    int PayRateID = 2;

    DateTime date = dict[EmpID][PayRateID];

Очевидно, что сначала вам нужно проверить, существуют ли значения в словаре

0 голосов
/ 09 сентября 2011

То, что я предлагаю,

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);  
0 голосов
/ 09 сентября 2011

Если вы хотите найти строки, которые нужно удалить, лучше создать MyValue, представляющую всю строку. Помните, что Словарь не позволяет добавлять один ключ несколько раз. Более того, если вы хотите найти строки, вам не нужно хранить их значения в разных списках, потому что вы можете легко потерять трек, какое значение в каком списке соответствует какой строке. Поэтому лучше хранить строки, которые нужно удалить, таким образом:

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> как должное, поскольку словарь на самом деле представляет собой набор структур KeyValuePair. Так что вы можете попробовать использовать его, если вы не хотите создавать новые типы или хранить другое значение типа int в вашем классе.

Однако я думаю, что добавление int в MyValue не является большой проблемой - всегда полезно иметь некоторую обратную ссылку на мастер-коллекцию, и int довольно мал по сравнению с типом указателя. Но вам будет удобнее использовать MyValues, а не передавать везде KeyValuePairs или MyValue + int.

0 голосов
/ 09 сентября 2011

Почему бы вам просто не иметь тип сотрудника, который содержит всю информацию о вашем сотруднике, например

public class Employee
{
   List1<>()
   List2<>()
   List3<>()
}

А затем просто иметь словарь, например, такой:

Dictionary<int, Employee>();
...