2017-03-05 3 views
0

Ich habe eine Klasse:C#, wie Verfahren in einer Liste für jedes Element nennen <>

[DataContract] 
public class InventoryItem : NotifyPropertyChangeObject 
{ 
    private Guid _inventoryItemUid; 
    private string _description; 
    private bool _isActive; 

    [DataMember] 
    public Guid InventoryItemUid { 
     get { return _inventoryItemUid; } 
     set { ApplyPropertyChange<InventoryItem, Guid>(ref _inventoryItemUid, o => o.InventoryItemUid, value); } 
    } 
    [DataMember] 
    public string Description { 
     get { return _description; } 
     set { ApplyPropertyChange<InventoryItem, String>(ref _description, o => o.Description, value); } 
    } 
    [DataMember] 
    public bool IsActive { 
     get { return _isActive; } 
     set { ApplyPropertyChange<InventoryItem, Boolean>(ref _isActive, o => o.IsActive, value); } 
    } 

    public void CustomMethod() 
    { 
     // here some code.... 
    } 
} 

In meinem Anwendungscode ich ein List<InventoryItem>:

List<Entities.InventoryItem> items = new List<Entities.InventoryItem>(); 

var newItem = new Entities.InventoryItem(); 

using (Logistics.Data.Warehouse svc = new Data.Warehouse()) 
{ 
    items = svc.GetInventoryItems().ToList(); 
} 

ich für jeden anrufen müssen Artikel in der List<InventoryItem> die Methode CustomMethod().

Was ist der beste Weg, dies in Bezug auf die Leistung zu tun?

Ich weiß, ich kann ein foreach tun, aber wenn ich 5.000 Zeilen bekommen dann vielleicht foreach ist für die Leistung nicht gut. Eigentlich ist diese CustomMethod() wie eine Initialisierungscode Sache.

+0

Es gibt keine Möglichkeit, um eine Schleife zu verwenden –

+0

Aber wenn Sie immer noch die Methode für jede Zeile aufrufen müssen, spielt es eine Rolle, ob Sie 5 Zeilen oder 5.000 haben? Vielleicht könntest du erklären, was die Methode ist (es sei denn, sie tut wirklich etwas in jeder Zeile, dann gibt es keinen Weg um sie herum). – master2080

+0

Wenn es für jedes Element aufgerufen werden muss, warum nicht in Konstruktor setzen? – tomassino

Antwort

0

Wenn Ihre Liste eine riesige Liste ist, dass Sie es in Gruppen mit 20 Elementen aufteilen und auf jedem von ihnen die Aktion parallel tun:

private void CustomVoid(string s) 
{ 

} 

Und:

List<string> items = new List<string>(); 
for (int i = 0; i <= items.Count/20; i++) 
{ 
     List<string> smallList = items.Skip(i * 20).Take(20).ToList(); 
     smallList.AsParallel().ForAll(sm => CustomVoid(sm)); 
} 

In Kommentaren unten vorgeschlagen, um die Schleife zu vergessen und nur diese verwenden:

Das kann eine bessere Leistung haben.

Ich hoffe es hilft.

+1

Warum gruppieren Sie es in Chargen von 20 Elementen, anstatt nur PLINQ zu bestimmen, wie es zu optimieren? –

+1

dass items.AsParallel langsamer als nur – Slai

+0

würde Sie dies bedeuten: {? MaxDegreeOfParallelism =} 'Parallel.ForEach ( Artikel, neue ParallelOptions,' Was ist Ihr Vorschlag ** 20 ** ist eine Probennummer, er müsse? Wählen Sie es durch seine Situation. @Peter Bons. –

Verwandte Themen