如何在给定“IEnumerable<T>”的情况下调用需要“params T[]”参数的函数?

问题描述 投票:0回答:1

如何在给定

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)

c# .net entity-framework
1个回答
3
投票

如何在给定 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

© www.soinside.com 2019 - 2024. All rights reserved.