diff --git a/c#/crawler/src/Worker/ForumModeratorRevisionCrawlWorker.cs b/c#/crawler/src/Worker/ForumModeratorRevisionCrawlWorker.cs index a478de1c..2929df76 100644 --- a/c#/crawler/src/Worker/ForumModeratorRevisionCrawlWorker.cs +++ b/c#/crawler/src/Worker/ForumModeratorRevisionCrawlWorker.cs @@ -50,7 +50,7 @@ where e.IsCrawling ?.GetAttribute("href")?.Split("/home/main?id=")[1].NullIfEmpty()) .OfType(); return memberPortraits.Select(portrait => (type, portrait)); - }).SelectMany(i => i); + }).Flatten2(); } private async Task Save( diff --git a/c#/imagePipeline/src/Consumer/HashConsumer.cs b/c#/imagePipeline/src/Consumer/HashConsumer.cs index 1982f52b..7fe2235f 100644 --- a/c#/imagePipeline/src/Consumer/HashConsumer.cs +++ b/c#/imagePipeline/src/Consumer/HashConsumer.cs @@ -91,7 +91,7 @@ static byte[] GetThumbHashForMatrix(Mat mat) return rgbaMat.GetArray(out Vec4b[] pixels) ? ThumbHashes.Utilities.RgbaToThumbHash(mat.Width, mat.Height, pixels .Select(vec => new[] {vec.Item0, vec.Item1, vec.Item2, vec.Item3}) - .SelectMany(i => i).ToArray()) + .Flatten2().ToArray()) : throw new InvalidOperationException("Failed to convert matrix into byte array."); } }; diff --git a/c#/imagePipeline/src/Consumer/QrCodeConsumer.cs b/c#/imagePipeline/src/Consumer/QrCodeConsumer.cs index 8ffd8a43..4f04de60 100644 --- a/c#/imagePipeline/src/Consumer/QrCodeConsumer.cs +++ b/c#/imagePipeline/src/Consumer/QrCodeConsumer.cs @@ -29,7 +29,7 @@ protected override IEnumerable ConsumeInternal( imageKeyWithMatrix => imageKeyWithMatrix.ImageId, ScanQrCodeInImage) .ToList(); - db.ImageQrCodes.AddRange(imageQrCodeEithers.Rights().SelectMany(i => i)); + db.ImageQrCodes.AddRange(imageQrCodeEithers.Rights().Flatten2()); return imageQrCodeEithers.Lefts(); } diff --git a/c#/imagePipeline/src/ImageBatchConsumingWorker.cs b/c#/imagePipeline/src/ImageBatchConsumingWorker.cs index 4e000833..a16def59 100644 --- a/c#/imagePipeline/src/ImageBatchConsumingWorker.cs +++ b/c#/imagePipeline/src/ImageBatchConsumingWorker.cs @@ -109,7 +109,7 @@ void ConsumeConsumer( .Where(i => i.ImageInReply is not {HashConsumed: true, QrCodeConsumed: true, OcrConsumed: true}), imageWithBytes => imageWithBytes.ImageInReply.ImageId, DecodeImageOrFramesBytes(stoppingToken)) - .Rights().SelectMany(i => i).ToList(); + .Rights().Flatten2().ToList(); try { IReadOnlyCollection ExceptConsumed @@ -200,7 +200,7 @@ private async Task ConsumeOcrConsumer( var scriptGroupings = await forumScripts.AsNoTracking() .GroupBy(e => e.Fid, e => e.Script) .ToListAsync(stoppingToken); - var scripts = scriptGroupings.SelectMany(i => i).Distinct().ToList(); + var scripts = scriptGroupings.Flatten2().Distinct().ToList(); var recognizedTextLinesKeyByScript = new Dictionary>(scripts.Count); scripts.ForEach(script => recognizedTextLinesKeyByScript[script] = []); diff --git a/c#/imagePipeline/src/Ocr/JointRecognizer.cs b/c#/imagePipeline/src/Ocr/JointRecognizer.cs index 92f39a4d..570f627d 100644 --- a/c#/imagePipeline/src/Ocr/JointRecognizer.cs +++ b/c#/imagePipeline/src/Ocr/JointRecognizer.cs @@ -42,10 +42,10 @@ public IReadOnlyCollection> RecognizeMatrice var detectedEithers = _paddleOcrProvider .DetectMatrices(matricesKeyByImageKey, failedImageHandler, stoppingToken).ToList(); var recognizedResultsViaPaddleOcr = - recognizedEithersViaPaddleOcr.Rights().SelectMany(i => i).ToList(); + recognizedEithersViaPaddleOcr.Rights().Flatten2().ToList(); var recognizedEithersViaTesseract = RecognizeMatricesViaTesseract( recognizedResultsViaPaddleOcr, - detectedEithers.Rights().SelectMany(i => i).ToList(), + detectedEithers.Rights().Flatten2().ToList(), matricesKeyByImageKey, stoppingToken) .ToList(); diff --git a/c#/shared/src/ExtensionMethods.cs b/c#/shared/src/ExtensionMethods.cs index 6e44b3e1..e52d82f7 100644 --- a/c#/shared/src/ExtensionMethods.cs +++ b/c#/shared/src/ExtensionMethods.cs @@ -46,6 +46,9 @@ public static IEnumerable> IntersectByKey> first, IEnumerable second) => first.IntersectBy(second, pair => pair.Key); + + public static IEnumerable Flatten2(this IEnumerable> source) => + source.SelectMany(i => i); } public static partial class ExtensionMethods {