2015-11-30 5 views
0

Есть ли более быстрый способ заполнить список, основанный на такой функции, как расстояние для векторов?Список заполнения на основе условия

private static IEnumerable<Vector2> SortSpecialBuildingsByDistance(
    Vector2 house, 
    IEnumerable<Vector2> specialBuildings) 
{ 
    List<float> optionList = new List<float>(); 
    foreach (var item in specialBuildings) 
    { 
     optionList.Add(Vector2.Distance(item, house)); 
    } 
} 
+2

Вы можете использовать Linq чтобы довести его до одной линии, но это было бы не быстрее. С другой стороны, ваш код даже не компилируется, так как он не имеет возврата. – juharr

+0

Да, я знаю, что это только часть метода! Я предпочитаю один лайнер по сравнению с этим кодом –

+0

Я не уверен, что использование чего-либо параллельного при добавлении в общий список фактически приведет к тому, что вы получите какую-либо производительность. Все, что вы делаете, сначала измерьте, затем решите. Кстати, я не вижу, чтобы вы что-то фильтровали, добавляя только расстояние до списка. –

ответ

1

Вы можете попробовать реализовать PLINQ (Parallel Linq):

List<float> optionList = specialBuildings 
    .AsParallel() 
    .Select(item => Vector2.Distance(item, house)) 
    .ToList(); 
2

Вы можете использовать Parallel.ForEach:

ConcurrentBag<Vector2> optionList = new ConcurrentBag<Vector2>(); 
Parallel.ForEach(specialBuildings, (item) => { optionList.Add(Vector2.Distance(item, house)); }); 

Список не поточно-так что вам нужно будет использовать один из Thread-Safe Collections. В приведенном выше примере используется ConcurrentBag, но есть и другие.

+0

@Tigran обновлено –

0

Код не может работать быстрее, но вы могли бы сделать это в одной строке: return specialBuildings.Select(item => Vector2.Distance(item, house)).ToList()

Смежные вопросы