Key Value Pair List

前端 未结 1 1790
感情败类
感情败类 2020-12-25 11:02

I have a list with below elements:

{[A,1] ; [B,0] ; [C,0] ; [D,2]; [E,0] ; [F,8]}

When Variable =3 -> i want the return value to be A,D

相关标签:
1条回答
  • 2020-12-25 11:23

    Using one of the subsets method in this question

    var list = new List<KeyValuePair<string, int>>() { 
        new KeyValuePair<string, int>("A", 1),
        new KeyValuePair<string, int>("B", 0),
        new KeyValuePair<string, int>("C", 0),
        new KeyValuePair<string, int>("D", 2),
        new KeyValuePair<string, int>("E", 8),
    };
    
    int input = 11;
    var items = SubSets(list).FirstOrDefault(x => x.Sum(y => y.Value)==input);
    

    EDIT

    a full console application:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var list = new List<KeyValuePair<string, int>>() { 
                    new KeyValuePair<string, int>("A", 1),
                    new KeyValuePair<string, int>("B", 2),
                    new KeyValuePair<string, int>("C", 3),
                    new KeyValuePair<string, int>("D", 4),
                    new KeyValuePair<string, int>("E", 5),
                    new KeyValuePair<string, int>("F", 6),
                };
    
                int input = 12;
                var alternatives = list.SubSets().Where(x => x.Sum(y => y.Value) == input);
    
                foreach (var res in alternatives)
                {
                    Console.WriteLine(String.Join(",", res.Select(x => x.Key)));
                }
                Console.WriteLine("END");
                Console.ReadLine();
            }
        }
    
        public static class Extenions
        {
            public static IEnumerable<IEnumerable<T>> SubSets<T>(this IEnumerable<T> enumerable)
            {
                List<T> list = enumerable.ToList();
                ulong upper = (ulong)1 << list.Count;
    
                for (ulong i = 0; i < upper; i++)
                {
                    List<T> l = new List<T>(list.Count);
                    for (int j = 0; j < sizeof(ulong) * 8; j++)
                    {
                        if (((ulong)1 << j) >= upper) break;
    
                        if (((i >> j) & 1) == 1)
                        {
                            l.Add(list[j]);
                        }
                    }
    
                    yield return l;
                }
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题