将List <t>排序到List <list <t>&gt;基于使用Linq的类型?

时间:2015-10-14 15:03:32

标签: c# linq sorting

我想基于对象内部的枚举值“排序”(不确定这是否是正确的术语)List,其中返回的List包含多个List s,每个包含具有相同枚举值的对象。

例如:

class Obj {
    public MyEnum EnumVal { get; set; }
}

enum MyEnum {
    Val1, Val2, Val3
}

// Input
new List<Obj> {
    new Obj { EnumVal = MyEnum.Val1 },
    new Obj { EnumVal = MyEnum.Val1 },
    new Obj { EnumVal = MyEnum.Val2 },
    new Obj { EnumVal = MyEnum.Val3 },
    new Obj { EnumVal = MyEnum.Val1 },
    new Obj { EnumVal = MyEnum.Val3 },
    new Obj { EnumVal = MyEnum.Val2 },
    new Obj { EnumVal = MyEnum.Val3 }
}

// Output
new List<List<Obj>> {
    new List<Obj>{
        new Obj { EnumVal = MyEnum.Val1 },
        new Obj { EnumVal = MyEnum.Val1 },
        new Obj { EnumVal = MyEnum.Val1 }
    },
    new List<Obj>{
        new Obj { EnumVal = MyEnum.Val2 },
        new Obj { EnumVal = MyEnum.Val2 }
    },
    new List<Obj>{
        new Obj { EnumVal = MyEnum.Val3 },
        new Obj { EnumVal = MyEnum.Val3 },
        new Obj { EnumVal = MyEnum.Val3 }
    }
};

我知道如何编写一个执行此操作的函数,但有没有办法使用Linq?

1 个答案:

答案 0 :(得分:4)

你在谈论分组,而不是排序。你可以用Linqs GroupBy来做到这一点:

    var tbody = document.querySelector('tbody');
    var trs = tbody.querySelectorAll('tr');
    var tr, index = 0, length = trs.length;
    for (; index < length; index++) {
        tr = trs[index];
        tr.setAttribute('data-state', 'enabled');
        tr.setAttribute('data-display', 'collapsed');
        tr.addEventListener('click',
            function () {
                if (this.classList.contains('alphabet-label')) {
                    return;
                }
                var trIndex = 0, trLength = trs.length, hasExpanded = false;
                var state = 'disabled';
                if (tbody.querySelectorAll('[data-display="expanded"]').length > 0) {
                    hasExpanded = true;
                    state = 'enabled';
                }
                for (; trIndex < trLength; trIndex++) {
                    trs[trIndex].setAttribute('data-state', state);
                    trs[trIndex].setAttribute('data-display', 'collapsed');
                }
                if (!hasExpanded) {
                    this.setAttribute('data-state', 'enabled');
                    this.setAttribute('data-display', 'expanded');
                }
            }
        );
    }
};