AsOrdered()不起作用

时间:2017-02-12 18:00:42

标签: c# parallel-processing

我正在尝试使用AsParallell()方法AsOrdered(),但总是看到无序结果。

using System;
using System.Linq;
using System.Collections.Generic;

namespace Parallel
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            List<String> cities = new List<String>() {
                "Barcelona",
                "Valencia",
                "Sevilla",
                "Zaragoza",
                "Málaga",
                "Murcia",
                "Palma",
                "Las Palmas de Gran Canaria",
                "Alicante",
                "Madrid",
                "Córdoba",
                "Valladolid",
                "Tarrasa",
                "Vigo",
                "Gijón",
                "Cartagena",
                "Hospitalet de Llobregat",
                "Vitoria",
                "La Coruña",
                "Granada",
                "Elche",
                "Oviedo",
                "Badalona"
            };

            var filtered = cities.AsParallel().AsOrdered().Where(c => c.ToUpper().StartsWith("B") || c.ToUpper().EndsWith("A")).ToArray();

            Console.WriteLine("Cities starting with \"B\" or ends with \"A\"");

            foreach (String city in filtered) 
            {
                Console.WriteLine(city);
            }

        }
    }
}

输出结果为:

Cities starting with "B" or ends with "A"
Barcelona
Valencia
Sevilla
Zaragoza
Málaga
Murcia
Palma
Las Palmas de Gran Canaria
Córdoba
Tarrasa
Cartagena
Vitoria
La Coruña
Granada
Badalona

Press any key to continue...

怎么了?

我在Mac,Net Core项目中使用Visual Studio。

由于

2 个答案:

答案 0 :(得分:1)

AsOrdered()只维护List<string>中商品的原始顺序。如果您想按字母顺序订购商品,可以使用OrderBy方法:

var filtered = cities.AsParallel().Where(c => c.ToUpper().StartsWith("B") || c.ToUpper().EndsWith("A")).OrderBy(x => x).ToArray();

答案 1 :(得分:0)

AsOrdered并不意味着它会对您的收藏品进行排序。 AsOrdered表示它将保留现有订单。因为您的收藏最初是无序的 - 您的结果也是无序的。

如果你愿意的话

 cities.Sort();
在并行查询之前

- 您的结果将被订购。但是,如果您执行此操作但删除 AsParallel - 则无法保证您的结果无法订购。