具有 where 条件的 C# LINQ GroupBy

标签 c# linq validation

您知道在某些“where”+ 有一个不满足 where 条件的元素列表之后获取列表的最简单有效的方法是什么吗?

具体来说:

这是我的工作 linq。它获取文件名,将其拆分为名称和扩展名元组列表,并且: - 名称应该是唯一的 - 扩展名是基于排序列表(所以首先是 gif,如果这个名字没有 gif,则采用 png,然后是 jpg,然后是 jpeg,不支持任何其他扩展名)

/// <summary>
/// Supported image extensions.
/// The list is sorted cause we have priorities here.
/// </summary>
SortedList<short, string> supportedExtensions = new SortedList<short, string> { { 1, "gif" }, { 2, "png" }, { 0, "jpg" }, { 4, "jpeg" } };


var filesList = Directory.GetFiles(string.Concat(Directory.GetCurrentDirectory(), "\\images", "\\"))
                            .Select(s => Tuple.Create(s.Substring(s.LastIndexOf(@"\") + 1, s.LastIndexOf(@".") - 1 - s.LastIndexOf(@"\")), s.Substring(s.LastIndexOf(@".") + 1)))
                            .Where(x => supportedExtensions.Values.Contains(x.Item2)) // only supported extensions here!
                            .GroupBy(g => g.Item1) // we are assured that every group has proper and at least one value
                            .Select(group => group.OrderBy(o => supportedExtensions.IndexOfValue(o.Item2)).First()); // get only one extension in each name group by priorities as in sorted list

线索是我还想要不符合条件的filesList,以便在警告消息中写入那些文件名(然后可以忘记它们)。

我试过这样做:

var fileListGroupedBySupportedExtension = Directory.GetFiles(Directory.GetFiles(string.Concat(Directory.GetCurrentDirectory(), "\\images", "\\")))
                            .Select(s => Tuple.Create(s.Substring(s.LastIndexOf(@"\") + 1, s.LastIndexOf(@".") - 1 - s.LastIndexOf(@"\")), s.Substring(s.LastIndexOf(@".") + 1)))
                            .GroupBy(g => supportedExtensions.Values.Contains(g.Item2));

var fileListWithSupportedExtension = fileListGroupedBySupportedExtension
                                .Where(gr => gr.Key == true);

但我不知道如何进入这个列表并在另一个地方创建或选择,所以我显然做错了什么:)

在处理此类验证/linq 内容时,这种方式是否正确?

最佳答案

首先要注意:请使用System.IO.Path 方法。他们将使生活变得更加轻松。您可以使用 Path.GetFileNameWithoutExtension 获取不带扩展名的文件名,并通过 Path.GetExtension 获取扩展名。这使您更容易理解您在做什么。

其次,问题是您要丢弃所有没有扩展名的文件。您可以避免这种情况并简单地分配一个空扩展名,如果该扩展名不在您的预期范围内并为其分配最低优先级。如果扩展名不受支持,这基本上会在第一次尝试时将您的 where 与另一个将扩展名重置为 nullselect 交换。

第三,至少当您的扩展列表不动态变化时,您也可以使用常规的 List。这比 SortedList 的开销更小。

关于具有 where 条件的 C# LINQ GroupBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44691613/

相关文章:

php - 在 Controller 中验证

ruby - 为什么我不能在控制台中检查 ActiveRecord 验证?

c# - 如何在微软新的Visual Studio Code中编译c#?

c# - 访问匿名类型集合中的属性 - C#

c# - 如何使用带有客户端证书的 (Microsoft.AspNetCore.TestHost)TestServer

c# - 如何比较两个列表并将值设置为列表属性

c# - 即使生成的 SQL 很快, Entity Framework 也会随着添加的额外连接而逐渐变慢

javascript - 禁用输入类型=数字的输入验证

c# - Unity 5 Windows Phone 8 游戏在 wp8 设备中启动时崩溃

c# - 使用 native C++、托管 C++ cli 和 C# 解决方案在混合模式下进行调试