简体   繁体   中英

OrderBy Collection in Dictionary Value based on Property of the Collection

I'm having a List<Department> , in that it has Department Name , List of Employees Name and OrderBy Dicrection for List. Now I need to construct a Dictionary<string, ObservableCollection<Employee>> , the KEY is a Department Name and the Value is an ObservableCollection by using List<Department> .

Expectation : I need to Sort the EmpName within the ObservableCollection<Employee> which is present in Dictionary<string, ObservableCollection<Employee>> EmpList based on sortEmpName Property which is in List<Department> DepList using LINQ

I written the LINQ for this in the below Main() Function.

void Main()
{
    List<Department> DepList = new List<Department>()
    {
        new Department() { 
            DepName = "HR", 
            sortEmpName = FilterListSortDirection.SortDirection.Ascending, 
            EmpName = new List<string>() {"Raj", "Baba"}
        },
        new Department() {
            DepName = "iLab",
            sortEmpName = FilterListSortDirection.SortDirection.Descending,
            EmpName = new List<string>() {"Emma", "Kaliya"}
        },
        new Department() {
            DepName = "Testing",
            sortEmpName = FilterListSortDirection.SortDirection.None,
            EmpName = new List<string>() {"Supriya", "Billa"}
        }
    };


    Dictionary<string, ObservableCollection<Employee>> EmpList = DepList.Select(m => 
                                new {
                                    Dep = m.DepName,
                                    EmpCollection = new ObservableCollection<Employee>(
                                                            m.EmpName.Select(k =>
                                                                new Employee() { EmpName = k, IsChecked = true }).ToList())
                                }
                            ).ToDictionary(x => x.Dep, x => x.EmpCollection);

}

The Model Classes are

public class Employee
{
    public string EmpName { get; set; }
    public bool IsChecked { get; set; }
}

public class Department
{
    public string DepName { get; set; }
    public FilterListSortDirection.SortDirection sortEmpName { get; set; }
    public List<string> EmpName { get; set; }
}

public class FilterListSortDirection
{
    public enum SortDirection
    {
        None,
        Ascending,
        Descending
    }
}

The Output Screen Shot of List<Department> DepList

在此处输入图片说明

The Output Screen Shot of Dictionary<string, ObservableCollection<Employee>> EmpList

在此处输入图片说明

Expectation : I need to Sort the EmpName within the ObservableCollection<Employee> which is present in Dictionary<string, ObservableCollection<Employee>> EmpList based on sortEmpName Property which is in List<Department> DepList using LINQ

This is a small part of a complex LINQ query in my project, so, I need to achieve this in LINQ. Kindly assist me.

  • HR => List of Employee Names should be in Ascending
  • iLab => List of Employee Names should be in Descending
  • Testing => List of Employee Names should be in original order - None (ie, No Change - Don't Sort)

I guess you need something like this:

var EmpList = DepList.ToDictionary(p => p.DepName, p =>
    {
        var empList = p.EmpName.Select(k => new Employee() { EmpName = k, IsChecked = true });
        if (p.sortEmpName == FilterListSortDirection.SortDirection.Ascending)
        {
            empList = empList.OrderBy(q => q.EmpName);
        }
        else if (p.sortEmpName == FilterListSortDirection.SortDirection.Descending)
        {
            empList = empList.OrderByDescending(q => q.EmpName);
        }
        return new ObservableCollection<Employee>(empList.ToList());
    });

use OrderBy

Dictionary<string, ObservableCollection<Employee>> EmpList = DepList.Select(m => new
{
    Dep = m.DepName,
    EmpCollection = 
    m.sortEmpName == SortDirection.Ascending ? 
        new ObservableCollection<Employee>(m.EmpName.Select(k => new Employee {EmpName = k, IsChecked = true}).ToList().OrderBy(emp => emp.EmpName)) :
    m.sortEmpName == SortDirection.Descending ?
        new ObservableCollection<Employee>(m.EmpName.Select(k => new Employee { EmpName = k, IsChecked = true }).ToList().OrderByDescending(emp => emp.EmpName)) :
        new ObservableCollection<Employee>(m.EmpName.Select(k => new Employee { EmpName = k, IsChecked = true }).ToList())
}).ToDictionary(x => x.Dep, x => x.EmpCollection);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM