classCollection:def__init__(self, model=None, datas=None):
self._model = model
self._type =type(model)
self._datas =[]if datas isnotNone:
self.addrange(datas)def__len__(self):returnlen(self._datas)def__and__(self, other):return self.union(other)def__or__(self, other):return self.intersect(other)def__contains__(self, item):return item in self._datas
def__iter__(self):
self._index =0return self
def__del__(self):
self.clear()def__delitem__(self, key):
self.removeat(key)def__next__(self):if self._index <len(self._datas):
result = self._datas[self._index]
self._index +=1return result
else:raise StopIteration
def__str__(self):returnstr(self._datas)def__isub__(self, other):if other is Collection:for i in other:if i in self:
self.remove(i)return self
self.remove(other)return self
def__iadd__(self, other):if other is Collection:
self.addrange(other)return self
self.add(other)return self
def__getitem__(self, item):iftype(item)==int:return self._datas[item]else:raise Exception("Index Must Be Number")def__setitem__(self, key, value):iftype(key)==intand key <len(self._datas)-1andtype(value)== self._type:
self._datas[key]= value
def__bool__(self):returnlen(self._datas)!=0def__copy__(self):return self.copy()defisnumber(self):return self._type ==intor self._type ==floatdefcount(self):returnlen(self._datas)defadd(self, item):if self._model isNone:# 未初始化
self._model = item
self._type =type(item)
self._datas.append(item)returnif self._type !=type(item):raise Exception("Type Error")else:
self._datas.append(item)definsert(self, index, item):iftype(index)!=int:raise Exception("Index must be number")if self._type !=type(item):raise Exception("Type Error")
self._datas.insert(index, item)defaddrange(self, items):try:for i in items:if self._type !=type(i)and self._model isnotNone:raise Exception("Type Error")else:
self.add(i)except:raise Exception("Could Not Add Items")defremove(self, item):if item in self._datas:
self._datas.remove(item)else:raise Exception("Could Not Find Object")defremoveat(self, index):iflen(self._datas)-1< index:raise Exception("Over float")else:del self._datas[index]defcopy(self):
result = Collection(self._model, self._datas)return result
defclear(self):
self._datas.clear()defindexof(self, item):for index, data inenumerate(self._datas):if item == data:return index
else:continuedeftype(self):return self._type
defmodel(self):return self._model
defreverse(self):
self._datas.reverse()defsort(self, action=None):
self._datas.sort(key=action)defrandom(self, count, dicts=None):if self._type ==intor self._type ==floator self._model isNone:if dicts isNone:for i inrange(count):
self.add(random.randint(-65535,65535))else:for i inrange(count):
self.add(dicts[random.randint(0,len(dicts))])else:raise Exception("Type Error")# Linq 拓展语句defsingle(self, item):if item notin self._datas:raise Exception('Data is not Exist')
count =0for i in self._datas:if i == item:
count +=1return count ==1defcounter(self, item):if item notin self._datas:raise Exception('Data is not Exist')
count =0for i in self._datas:if i == item:
count +=1return count
defmax(self, action=None):if self._type ==intor self._type ==float:if action isnotNone:
result =0for i in self._datas:
result = i if action(i)> action(result)else result
return result
result =0for i in self._datas:
result = i if i > result else result
return result
else:if action isnotNone:raise Exception('Type Error')else:
result =0for i in self._datas:
result = i if action(i)> action(result)else result
return result
defmin(self, action=None):if self._type ==intor self._type ==float:if action isnot Nohne:
result =0for i in self._datas:
result = i if action(i)< action(result)else result
return result
result =0for i in self._datas:
result = i if i < result else result
return result
else:if action isnotNone:raise Exception('Type Error')else:
result =0for i in self._datas:
result = i if action(i)< action(result)else result
return result
defwhere(self, expression):
datas =[]for i in self._datas:if expression(i):
datas.append(i)else:continue
result = Collection(self._model, datas)return result
defdelete(self, expression):
data = self.copy()for i in data:if expression(i):
self.remove(i)defunion(self, collection):if self._type != collection.type():raise Exception('Type Error')else:
result = Collection()
cp_self = self.copy()
cp_col = collection.copy()for i inrange(len(cp_self)):if cp_self[i]in cp_col:
result.add(cp_self[i])
cp_col.remove(cp_self[i])return result
defintersect(self, collection):if self._type != collection.type():raise Exception('Type Error')else:
result = Collection()for i in self:
result.add(i)for i in collection:
result.add(i)return result
defall(self, expression):for i in self._datas:ifnot expression(i):returnFalseelse:continuereturnTruedeffirstordefault(self, default=None):iflen(self._datas)==0:return default
else:return self._datas[0]deffirst(self):iflen(self._datas)==0:raise Exception("No Data In Collection")else:return self._datas[0]defavg(self, action=None):if action isNone:
sums =0for i in self._datas:
sums += i
return sums /len(self._datas)else:
sums =0for i in self._datas:
sums += action(i)return sums /len(self._datas)defsum(self, action=None):if action isNone:
sums =0for i in self._datas:
sums += i
return sums
else:
sums =0for i in self._datas:
sums += action(i)return sums
defforeach(self, action):
result = Collection()for i inrange(len(self._datas)):
result.add(action(self._datas[i]))return result
# 类型转换deftolist(self, function=None):if function isNone:return self._datas
else:
result =[]for i in self._datas:
result.append(function(i))return result
deftotuple(self, function=None):if function isNone:returntuple(self._datas)else:
result =[]for i in self._datas:
result.append(function(i))returntuple(result)deftostring(self):returntype(self._model)deftodictionary(self, function):
data ={}for i in self._datas:
keyvalue = function(i)
data[keyvalue[0]]= keyvalue[1]return data