Как я могу просмотреть список <T> и получить каждый элемент?

176

Как я могу просмотреть список и получить каждый элемент?

Я хочу, чтобы вывод выглядел так:

Console.WriteLine("amount is {0}, and type is {1}", myMoney.amount, myMoney.type);

Вот мой код:

static void Main(string[] args)
{
    List<Money> myMoney = new List<Money> 
    {
        new Money{amount = 10, type = "US"},
        new Money{amount = 20, type = "US"}
    };
}

class Money
{
    public int amount { get; set; }
    public string type { get; set; }
}
user1929393
источник

Ответы:

274

foreach:

foreach (var money in myMoney) {
    Console.WriteLine("Amount is {0} and type is {1}", money.amount, money.type);
}

MSDN Link

В качестве альтернативы, поскольку это List<T>..., который реализует метод индексатора [], вы также можете использовать обычный forцикл ... хотя он менее читабелен (IMO):

for (var i = 0; i < myMoney.Count; i++) {
    Console.WriteLine("Amount is {0} and type is {1}", myMoney[i].amount, myMoney[i].type);
}
Саймон Уайтхед
источник
7
@awudoin Что? Нет, это не так ... он создает ссылку на стек ... кроме этого, это не так. А foreachне клонирует объекты ..
Саймон Уайтхед
2
Я должен уточнить: он также создает Enumerator.. который является struct.. который также находится в стеке. Так что я до сих пор не совсем понимаю, что вы получили с вашим комментарием.
Саймон Уайтхед
7
Ты прав .... это просто Enumeratorа не копия объекта. Но факт остается фактом, в зависимости от того, что вы делаете, больше foreachциклов по сравнению с forциклом. Я только что провел быстрый тест с вашим кодом с 100 000 записей в, Listи foreachцикл занял в два раза больше времени (фактически в 1,9 раза больше). Это не обязательно верно во всех ситуациях, но во многих. Это зависит от размера списка, от того, сколько операций вы выполняете в цикле и т. Д. Это было то, к чему я стремился.
awudoin
36

Просто для полноты, есть также способ LINQ / Lambda:

myMoney.ForEach((theMoney) => Console.WriteLine("amount is {0}, and type is {1}", theMoney.amount, theMoney.type));
acarlon
источник
20

Как и любая другая коллекция. С добавлением List<T>.ForEachметода.

foreach (var item in myMoney)
    Console.WriteLine("amount is {0}, and type is {1}", item.amount, item.type);

for (int i = 0; i < myMoney.Count; i++)
    Console.WriteLine("amount is {0}, and type is {1}", myMoney[i].amount, myMoney[i].type);

myMoney.ForEach(item => Console.WriteLine("amount is {0}, and type is {1}", item.amount, item.type));
хан
источник
6
Еще одно предупреждение, если у вас большой список (под большим я имею в виду более 100 000 элементов), myMoney.Count начинает занимать некоторое время, поскольку ему приходится проходить по списку, чтобы выполнить подсчет, и в примерах выше над myMoney. Счет считается каждый раз вокруг цикла. Так что используя int myMoneyC = myMoney.Count; for (int i = 0; i <myMoneyC; i ++) сделает этот цикл во много раз быстрее.
SuperGSJ
12

Вот как бы я написал, используя больше functional way. Вот код:

new List<Money>()
{
     new Money() { Amount = 10, Type = "US"},
     new Money() { Amount = 20, Type = "US"}
}
.ForEach(money =>
{
    Console.WriteLine($"amount is {money.Amount}, and type is {money.Type}");
});
Кодер Абсолют
источник
2
Спасибо. Это очень короткий способ достижения этой задачи. Вы также использовали новый компактный синтаксис writeLine, представленный в VS 2017 / .NET 4.7.
глубокое