我用Guids做了一些測試代碼。 您要使用Distinct()的原因是它將使用Hashset而不是列表來跟蹤唯一項目。 對於較大的行數,Hashset可能比您的uniqueCheck列表快得多。
正如您在結果中看到的那樣,如果您編寫guids.AsParallel
,但比編寫Select(....).AsParallel()
時要慢, 下面是結果代碼:
編輯:添加Select(... regex..)
營造一個更「鍵重複」
var guids = Enumerable.Range(1, 1600000).Select(_ => Guid.NewGuid().ToString().ToUpper()).ToList();
guids = guids.Select(g => Regex.Replace(g, @"^([0-9A-F])[^\-]+", "$1$1$1$1")).ToList();
var delimiters = "-".ToCharArray();
var delimiters = "-".ToCharArray();
var w = Stopwatch.StartNew();
var x = guids.Select(guid => guid.Split(delimiters)[0].ToLower()).Distinct().ToList();
Console.WriteLine(w.Elapsed); // 1.80 seconds
w = Stopwatch.StartNew();
var y = guids.Select(guid => guid.Split(delimiters)[0].ToLower()).AsParallel().Distinct().ToList();
Console.WriteLine(w.Elapsed); // 1.67 seconds
w = Stopwatch.StartNew();
var z = guids.AsParallel().Select(guid => guid.Split(delimiters)[0].ToLower()).Distinct().ToList();
Console.WriteLine(w.Elapsed); // 0.75 seconds
編輯列表:這裏是與選擇第一行的解決方案獨特密鑰
// for selecting the first row which has unique "key"
var w = Stopwatch.StartNew();
var a = guids.GroupBy(guid => guid.Split(delimiters)[0].ToLower()).Select(grp => grp.First()).ToList();
Console.WriteLine(w.Elapsed); // 0.65 seconds
w = Stopwatch.StartNew();
var b = guids.AsParallel().GroupBy(guid => guid.Split(delimiters)[0].ToLower()).Select(grp => grp.First()).ToList();
Console.WriteLine(w.Elapsed); // 0.83 seconds
這是多少行?我不太確定在這個用例中使用Parallel.For會更快。 – mortb
有1.6百萬行。 –
您可以試試這個: 'var delimiters = delimiter.ToCharArray();' 'var dtUnqiueRows = Rows.Select(row => row.Split(delimiters)[0] .Trim()。ToLower())。AsParallel ().Distinct())。ToList();' – mortb