Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- LinqArray = class()
- function LinqArray:init(items)
- if items then
- self:addRange(items)
- end
- end
- function LinqArray:add(item)
- table.insert(self, item)
- end
- function LinqArray:addRange(items)
- for k,v in ipairs(items) do
- self:add(v)
- end
- end
- function LinqArray:where(func)
- local results = LinqArray()
- for k, v in ipairs(self) do
- if func(v) then
- results:add(v)
- end
- end
- return results
- end
- function LinqArray:select(func)
- local results = LinqArray()
- for k, v in ipairs(self) do
- results:add(func(v))
- end
- return results
- end
- function LinqArray:selectMany(func)
- local results = LinqArray()
- local selectResults = self:select(func)
- for _,item in ipairs(selectResults) do
- results:addRange(item)
- end
- return results
- end
- function LinqArray:count()
- return # self
- end
- function LinqArray:first() return self[1] end
- function LinqArray:distinct(objHashFunc)
- local results = LinqArray()
- local valueExists = {}
- if objHashFunc then
- for k, v in ipairs(self) do
- if not valueExists[objHashFunc(v)] then
- results:add(v)
- valueExists[objHashFunc(v)] = true
- end
- end
- else
- for k, v in ipairs(self) do
- if not valueExists[v] then
- results:add(v)
- valueExists[v] = true
- end
- end
- end
- return results
- end
- function LinqArray:toDictionary(keyFunc, valueFunc)
- local results = {}
- for k, v in ipairs(self) do
- results[keyFunc(v)] = valueFunc(v)
- end
- return results
- end
- function LinqArray:sum(func)
- local sum = 0
- if func then
- for k, v in ipairs(self) do
- sum = sum + func(v)
- end
- else
- for k, v in ipairs(self) do
- sum = sum + v
- end
- end
- return sum
- end
- function LinqArray:avg(func)
- return self:sum(func) / self:count()
- end
- function LinqArray:any(func)
- local results = self
- if func then
- results = results:where(func)
- end
- return results:count() > 0
- end
- function LinqArray:minOrMax(selector, cond)
- local curResult = nil
- local curVal
- for _,i in ipairs(self) do
- if selector then
- curVal = selector(i)
- else
- curVal = i
- end
- if not curResult then
- curResult = curVal
- elseif cond(curVal, curResult) then
- curResult = curVal
- end
- end
- return curResult
- end
- function LinqArray:min(selector)
- return self:minOrMax(selector, function(a,b) return a < b end)
- end
- function LinqArray:max(selector)
- return self:minOrMax(selector, function(a,b) return a > b end)
- end
- function LinqArray:removeWhere(func)
- local i = 1
- while i <= self:count() do
- if func(self[i]) then
- table.remove(self, i)
- else
- i = i + 1
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement