如何避免使用 IF-Else 并在 .where() 函数内使用内联 if 条件?

How to avoid using IF-Else and use inline if condition inside the .where() function?

 q = q.Where(s => 
                    !matchingRecords.Contains(s.Id)
                    || (s.SecId != null)
                 );

matchingrecords 可能为空或其中有 0 个项目,因为它是一个列表。所以,在那种情况下,上面的代码会失败。我只想检查这是否包含 匹配的记录不为空并且有一些元素不为空。

一种方法是放置 IF-Else 块并重复代码,但我想内联执行,如何?

所以,如果输入条件是:

  • matchingRecords 不为空;
  • matchingRecords非空(包含元素,.Count > 0);
  • 不允许 if-else 使用;

可以通过ternary完成吗?

var list = matchingRecords?.Count > 0 ?
           q.Where(s => !matchingRecords.Contains(s.Id) && s.SecId != null).ToList()
           : new List<Record>();

matchingRecords? 检查是否为空,.Count 检查是否为“非空”。 If-else 替换为三元,这将在 else 情况下使用 Where 或 return new List<Record> 过滤集合。

样本:

class Program
{
    private static List<int> matchingRecords; // It is null, we "forget" to initialize it

    static void Main(string[] args)
    {
        var list = new List<Record>() 
        {
            new Record { Id = 0, SecId ="Some SeqId" },
            new Record { Id = 1, SecId = null },
            new Record { Id = 2, SecId = "Another SeqId" },
        };

        var filteredRecords = FilterRecords(list);
    }

    static IEnumerable<Record> FilterRecords(IEnumerable<Record> q)
    {
        return matchingRecords?.Count > 0 ? // Checking for not null and not empty (if case)
               q.Where(s => !matchingRecords.Contains(s.Id) && s.SecId != null)
               : q; // else case
    }
}

public class Record
{
    public int Id { get; set; }
    public string SecId { get; set; }
}

不确定是否正确重现了您的情况,如有错误请指正。

 q = q.Where(s => (matchingRecords != null && matchingRecords.Count > 0 && 
                !matchingRecords.Contains(s.Id))
                || (s.SecId != null)
             );

The condition matchingRecords != null && matchingRecords.Count > 0 will ensure !matchingRecords.Contains(s.Id) is executed only if matchingRecords has at least 1 record