我想基于对象内部的枚举值“排序”(不确定这是否是正确的术语)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?
答案 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');
}
}
);
}
};