是否有一种类型同时包含:List<T> 和 HashSet<T>?

Is there a type that includes both: List<T> and also HashSet<T>?

我有两种显示方法:一种是项目列表,另一种是项目哈希集。方法是相同的。有没有办法用参数类型编写方法,这样我就可以使用相同的方法,而不管传递给方法的参数类型:List<T>HashSet<T>?

方法有:

    public static void DisplayList<T>(List<T> list)
    {
        int i = 0;
        foreach (T item in list)
        {
            Console.Write(item.ToString());
            if (i < list.Count - 1)
            {
                Console.Write(", ");
            }
            i++;
        }
        Console.WriteLine();
    }

    public static void DisplayHashSet<T>(HashSet<T> set)
    {
        int i = 0;
        foreach (T item in set)
        {
            Console.Write(item.ToString());
            if (i < set.Count - 1)
            {
                Console.Write(", ");
            }
            i++;
        }
        Console.WriteLine();
    }

您可以使用 ICollection<T> 接口:

public static void DisplayHashSet<T>(ICollection<T> col)
{
    int i = 0;
    foreach (T item in col)
    {
        Console.Write(item.ToString());
        if (i < col.Count - 1)
        {
            Console.Write(", ");
        }
        i++;
    }
    Console.WriteLine();
}

根据 List<T> and HashSet<T> documentation both implement ICollection<T> and IReadOnlyCollection<T>,您可以使用这些接口中的任何一个,因为它们具有 Count 属性。

由于您没有修改集合,只是显示它,IReadOnlyCollection<T> 在这里看起来更好

public static void DisplayCollection<T>(IReadOnlyCollection<T> collection)
{
    int i = 0;
    foreach (T item in collection)
    {
        Console.Write(item.ToString());
        if (i < collection.Count - 1)
        {
            Console.Write(", ");
        }
        i++;
    }
    Console.WriteLine();
}

但是,如果您只需要集合的字符串表示形式,string.Join 接受重载的方法 IEnumerable<T> 允许您在一行中完成此操作

var list = new List<int>() { 1, 2, 3, 4 };
var display = string.Join(", ", list);
Console.WriteLine(display);

上面的代码会打印1, 2, 3, 4,和上面的DisplayCollection<T>方法一样