如何在给定
param T[]
的情况下调用需要 IEnumerable<T>
参数的函数?
考虑以下函数签名:
public async Task AddNotificationRecordsAsync(IEnumerable<NotificationRecord> notificationRecords, CancellationToken cancellationToken = default)
在这个函数中,我想调用以下EF Core函数:
void DbSet<NotificationRecord>.AddRange(params NotificationRecord[] entities)
但是,我不知道如何将
IEnumerable
转换为单独的params
。
在Python中,我会使用解包运算符“*”,如下所示:
f(*mylist)
。
如何在给定 IEnumerable 的情况下调用需要 param T[] 参数的函数?
param
关键字允许您将数组作为单独的参数传递。但它并不禁止您传递常规数组。
此示例演示了这一点:
using System;
public class Program
{
static void f(params int[] vals)
{
foreach (int val in vals) Console.Write(val + ",");
Console.WriteLine("");
}
public static void Main()
{
f(1, 2, 3); // works
f(new int[3] { 1, 2, 3 }); // also works
}
}
Enumerable.ToArray
方法将 IEnumerable<T>
转换为 T[]
并将其传递给需要 param T[]
的方法:
public async Task AddNotificationRecordsAsync(IEnumerable<NotificationRecord> notificationRecords, CancellationToken cancellationToken = default)
{
// ...
//---------------------------------vvvvvvvvvvvvvvvvvvvvvvvvvvvvv--
DbSet<NotificationRecord>.AddRange(notificationRecords.ToArray());
}
旁注:
在这种特定情况下,正如@shingo 评论的那样,DbSet<TEntity>.AddRange
也有一个接受
IEnumerable<TEntity>
的overload。因此,您本来可以按原样通过
notificationRecords
。