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

Popular posts from this blog

javascript - Enclosure Memory Copies -

php - Replacing tags in braces, even nested tags, with regex -