c# - 根据优先级条件获取单个项目的最有效方式

标签 c# linq

我有一个场景,每个组中有多个图像,需要根据字符串条件提取单个图像。

下面是它现在完成的方式,并且有效;然而,不确定这是否是最有效的方式、性能、大小,也许也是明智的实践

               foreach (var g in groups)
                {
                    SomeType file = null;

                    if (file == null)
                    {
                        file = g.Where(i =>
                                 i.URL.Contains("StringA")
                                 ).FirstOrDefault();
                    }
                    if (file == null)
                    {
                        file = g.Where(i =>
                                  i.URL.Contains("StringB")
                                  ).FirstOrDefault();
                    }
                    if (file == null)
                    {
                        file = g.Where(i =>
                                i.URL.Contains("StringC")
                                ).FirstOrDefault();
                    }
                    if (file == null)
                    {
                       // etc...
                    }
                    if (file == null)
                    {
                        file = g.FirstOrDefault();
                    }
                }

最佳答案

恐怕您可能会觉得这个答案有点无聊,但我会避免尝试寻找一些非常令人印象深刻但复杂的 linq 查询。我相信这是可以做到的,但不值得为此头疼。

只需将所有字符串放在一个数组中,然后按优先顺序检查它们。除非你正在运行大量项目,否则它会足够快。您没有执行数据库查询 - 您的 foreach 循环清楚地表明您的数据已经在内存中。

所以,我会丢掉大的 if 语句,并以如下方式为目标:

string [] my_list = new string [] {"StringA", "StringB", "StringC"};

foreach (var g in groups)
{
    foreach (string s in my_list)
    {
        file = g.Where(i => i.URL.Contains(s)).FirstOrDefault();
        if (file != null)
            break;
    }
    if (file == null)
    {
        file = g.FirstOrDefault();
    }
}

就像我说的,不是很令人兴奋,但是更改搜索中的优先级以及\或添加和删除字符串非常容易。

HTH,

亚当。

关于c# - 根据优先级条件获取单个项目的最有效方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39536020/

相关文章:

c# - 将枚举绑定(bind)到 LINQ 和 SelectListItem

linq - 无法使用 LINQ 语法编译我的项目

c# - Linq 返回 IEnumerable<MyObject>,如何返回 MyListObject?

c# - 无法将类型 'Program.Data.View' 隐式转换为 System.linq.iqueryable<Program.Data.View>。

c# - Blazor,如果加载则返回/停止渲染

c# - 扩展方法的缺点?

c# - iOS 在 UITabBarController 中更改 UIMoreNavigationController 内的徽章颜色

c# - C#中不同out类型的动态参数列表

c# - Winforms 中的 System.UnauthorizedAccessException C#

c# - C# 字符串是否以空字符串结尾?