Есть ли тип, который включает в себя: List <T>, а также HashSet <T>? - PullRequest
2 голосов
/ 22 марта 2020

У меня есть два метода, которые отображают: один список элементов и один HashSet элементов. Методы идентичны. Есть ли способ написать метод с типом параметра, чтобы я мог использовать один и тот же метод независимо от типа аргумента, передаваемого методу: 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();
    }

Ответы [ 2 ]

6 голосов
/ 22 марта 2020

В соответствии с документами List<T> и HashSet<T> оба инструмента ICollection<T> и 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>

5 голосов
/ 22 марта 2020

Вы можете использовать интерфейс 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...