c# - Performance issues with repeatable loops as control part -
in application, need show made calls user. user can arrange filters, according want see. problem find quite hard filter calls without losing performance. using :
private void processfilterchoice() { _filteredcalls = serviceconnector.serviceconnector.singletonserviceconnector.proxy.getallcalls().tolist(); if (cbooutgoingincoming.selectedindex > -1) getfilterpartoutgoingincoming(); if (cbointernextern.selectedindex > -1) getfilterpartinternextern(); if (cbodatefilter.selectedindex > -1) getfilteredcallsbydate(); wbpdf.source = null; btnprint.content = "pdf preview"; } private void getfilterpartoutgoingincoming() { if (cbooutgoingincoming.selecteditem.tostring().equals("outgoing")) (int = _filteredcalls.count - 1; > -1; i--) { if (_filteredcalls[i].caller.e164.length > 4 || _filteredcalls[i].caller.e164.equals("0")) _filteredcalls.removeat(i); } else if (cbooutgoingincoming.selecteditem.tostring().equals("incoming")) (int = _filteredcalls.count - 1; > -1; i--) { if (_filteredcalls[i].called.e164.length > 4 || _filteredcalls[i].called.e164.equals("0")) _filteredcalls.removeat(i); } } private void getfilterpartinternextern() { if (cbointernextern.selecteditem.tostring().equals("intern")) (int = _filteredcalls.count - 1; > -1; i--) { if (_filteredcalls[i].called.e164.length > 4 || _filteredcalls[i].caller.e164.length > 4 || _filteredcalls[i].caller.e164.equals("0")) _filteredcalls.removeat(i); } else if (cbointernextern.selecteditem.tostring().equals("extern")) (int = _filteredcalls.count - 1; > -1; i--) { if ((_filteredcalls[i].called.e164.length < 5 && _filteredcalls[i].caller.e164.length < 5) || _filteredcalls[i].called.e164.equals("0")) _filteredcalls.removeat(i); } } private void getfilteredcallsbydate() { datetime period = datetime.now; switch (cbodatefilter.selecteditem.tostring()) { case "today": period = datetime.today; break; case "last week": period = datetime.today.subtract(new timespan(7, 0, 0, 0)); break; case "last month": period = datetime.today.addmonths(-1); break; case "last year": period = datetime.today.addyears(-1); break; default: return; } (int = _filteredcalls.count - 1; > -1; i--) { if (_filteredcalls[i].start < period) _filteredcalls.removeat(i); } }
_filtered calls list of "calls". calls class looks :
[datacontract] public class call { private user caller, called; private datetime start, end; private string conferenceid; private int id; private bool isnew = false; [datamember] public bool isnew { { return isnew; } set { isnew = value; } } [datamember] public int id { { return id; } set { id = value; } } [datamember] public string conferenceid { { return conferenceid; } set { conferenceid = value; } } [datamember] public datetime end { { return end; } set { end = value; } } [datamember] public datetime start { { return start; } set { start = value; } } [datamember] public user called { { return called; } set { called = value; } } [datamember] public user caller { { return caller; } set { caller = value; } }
can direct me better solution or make suggestions.
try using foreach loop instead of explicit loop iterator variable. if _filteredcalls list, _filteredcalls[i] take o(n) time. using foreach use built in iterator of list , speed increase.
edit: see looping backward through _filteredcalls, , modifying list.
so better:
_filteredcalls = _filteredcalls.where(c => c.caller.e164.length > 4 || c.caller.e164.equals("0"))
Comments
Post a Comment