键值对列表

51

我有一个包含以下元素的列表:

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

当变量为3时 -> 我希望返回的值是A,D

当变量为11时 -> 返回值应为A,D,F

当变量为2时 -> 返回值应为D

以此类推。

 int sum = myList.Sum(x => x.Value) 

如何获取对应的键(A、D、F)?


1
你写过任何代码吗?你可以试试从这里开始入手。 - Save
2
你如何选择这些项目?sum()函数? - Sriram Sakthivel
3
当输入为 0 时,应该返回 B,C和E - Sriram Sakthivel
2
@Moo-Juice 很多困惑。 如果列表是 2,1,1,4 并且输入为 4,返回值是 2,1,1 还是 4 - Sriram Sakthivel
1
这实际上看起来像是枚举标志问题。然而,为标志选择的值不是通常的二的幂,这将确保每个标志都是正交的。 - Aron
显示剩余3条评论
1个回答

106

使用这个问题中的子集方法之一

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);

编辑

一个完整的控制台应用程序:

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;
            }
        }
    }
}

谢谢14V - 但这里的“subsets”是什么? - 在Visual Studio中似乎没有出现。 - user2778395
1
@user2778395,我在答案中发布了它的链接。我使用了例如L.B的版本。 - I4V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接