skip to Main Content

I have two lists including string values and percentage. I want to have duplicate string values once in my list and sum up their percentage. I don’t know how can i access that specific place (in reasonsName) in the list (reasonsPercent).

List<object> reasonsPercent = new List<object>();
List<string> reasonsName = new List<string>();

foreach (var item in lvShareRateListSorted)
{

    string reasonName = "";
    reasonName = item.EventReasonTitle;

    if (reasonsName.Contains(reasonName))
    {
        // here i want to add item.TotalPercent to a TotalPercent of reasonName which exists in reasonsName
    }
    else
    {
        reasonsName.Add(reasonName);
        reasonsPercent.Add(item.TotalPercent);
    }
}

3

Answers


  1. How about using dictionary?

    dictionary is Key-Value collection type

    // You can add Content like 
    dictionary.Add(key, value);
    // remove
    dictionary.Remove(key);
    // access
    dictionary[key]
    
    var nameAndPercentages = new Dictionary<string, List<int>>();
    
    foreach (var item in lvShareRateListSorted)
    {
        string reasonName = item.EventReasonTitle;
        
        // if the name is not present in dictionary add and initalize list for percentages
        if (!nameAndPercentages.ContainsKey(reasonName))
        {
            nameAndPercentages.Add(reasonName, new List<int>());
        }
        // add percentage value to list which initialized above
        nameAndPercentages[reasonName].Add(item.TotalPercent);
    }
    
    foreach (var nameAndPercentage in nameAndPercentages)
    {
        Console.WriteLine($"Name: {nameAndPercentage.Key}, Sum: {nameAndPercentage.Value.Sum()}");
        // Same with Console.WriteLine("Name: " + nameAndPercentage.Key + ", Sum: " + nameAndPercentage.Value.Sum());
    }
    
    Login or Signup to reply.
  2. In this case, you can use a model for the list.

    First of all, we declare a class:

    public class Item
    {
        public string ReasonTitle { get; set; }
        public float TotalPercent { get; set; }
    
    }
    

    next, declare a list of this class:

    private static List<Item> items { get; set; } = new List<Item>();
    

    and then, we need to find every item in the list. If it is found, we update it. If not, we add the item to the list:

    public void AddOrEdit(Item  item)
    {
        string reasonName = item.ReasonTitle;
    
        var searchResult = items.Find(x => x.ReasonTitle == reasonName);
        if (searchResult != null) // It is in the list
        {
            searchResult.TotalPercent += item.TotalPercent;
        }
        else
        {
            items.Add(item);
        }
    }
    
    Login or Signup to reply.
  3. if you want two lists and a percentage of float or double or int

    var groupedList = lvShareRateListSorted
        .GroupBy(x => x.EventReasonTitle)
        .Select(x => new { EventReasonTitle = x.Key, TotalPercent= x.Sum(y => y.TotalPercent) });
    
    reasonsPercent = groupedList.Select(x => x.TotalPercent).ToList();
    reasonsName = groupedList.Select(x => x.EventReasonTitle).ToList();
    

    or with a dictionary

    var groupedList = lvShareRateListSorted
        .GroupBy(x => x.EventReasonTitle)
        .Select(x => new { EventReasonTitle = x.Key, TotalPercent= x.Sum(y => y.TotalPercent) });    
    
    var dictionary = groupedList.ToDictionary(x => x.EventReasonTitle, y => y.TotalPercent);
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search