更清洁的方式来分组2个级别的字典项目

时间:2013-07-28 12:14:06

标签: c# dictionary

我定义了一个网格词典:

Dictionary<Tuple<int, int>, decimal> _details;

其中键是 Item1 - &gt; ColumnIndex 第2项 - &gt; rowIndex位置

我有一个复杂的分组方法,应该将3个字典项组合在一起,

来自同一行,列为1,2,3或4,5,6或7,8,9或10,11,12然后处理它们 我已经完成了它并且它完美地工作但是我有一个更清洁的方法来做它?

我的代码:

私人布尔IsValid() {     //检查具有数量和值的每个值或两者都为null     //检查总数不为空

if (_details.Count() <= 0)
    return false;

var rows = _details.GroupBy(c => c.Key.Item2);
foreach (var item in rows)
{
    foreach (var subItem in item)
    {
        switch (subItem.Key.Item1)
        {
            case 1:
            {
                if (!item.Any(c => c.Key.Item1.In(2, 3)))
                    return false;
                break;
            }
            case 2:
            {
                if (!item.Any(c => c.Key.Item1 == 1) || item.Any(c => c.Key.Item1 == 3))
                    return false;
                break;
            }
            case 3:
            {
                if (!item.Any(c => c.Key.Item1 == 1) || item.Any(c => c.Key.Item1 == 2))
                    return false;
                break;
            }
                        // code continues the same way up to 12 
        return true;
    }

编辑:数据

_details = new Dictionary<Tuple<int, int>, decimal>();

_details.Add(new Tuple<int, int>(1, 1), 10);
_details.Add(new Tuple<int, int>(2, 1), 10);
// if abouve data only added return true
_details.Add(new Tuple<int, int>(4, 2), 10);
_details.Add(new Tuple<int, int>(6, 2), 10);
// still true 
_details.Add(new Tuple<int, int>(10, 4), 10);
_details.Add(new Tuple<int, int>(11, 4), 10);
//still true
_details.Add(new Tuple<int, int>(2, 2), 10);
_details.Add(new Tuple<int, int>(8, 1), 10);           
_details.Add(new Tuple<int, int>(10, 3), 10);
// adding the last 3 return false

enter image description here

1 个答案:

答案 0 :(得分:2)

通过将数字组解释为位组,可以稍微简化一下。

将一组小数字0..11转换为单个int,这样如果集合中存在数字k,则k中的位数设置为int {1}};否则,相应的位为零。

例如,您的插图将以二进制形式转换为数字010 001 101 011(空格用于分隔组)。注意,这些位是相反的,因为单元#1在左侧,而位号0在右侧。这对应于八进制数2153(当考虑三位数时,八进制很方便)。

给定这样的掩码,您可以检查每个三元组的有效性。只有八种可能性 - 000001010011100101110和{ {1}}。其中只有111000011有效。

以下是实现此目的的一种方法:

101