Как использовать ToList () для печати нескольких элементов списка? - PullRequest
2 голосов
/ 18 октября 2019

При попытке напечатать элементы в списке после выбора полей из этого списка я получаю сообщение об ошибке «невозможно преобразовать список в элемент». Некоторые запросы работают, но некоторые, такие как приведенный ниже, требуют другой печати void. Я бы хотел, чтобы он работал без нескольких пустот печати. ​​

Я попытался поместить цикл foreach непосредственно под запросом, но он не может найти нужные элементы для печати. ​​

 List<Item> items = new List<Item>();//create list

 items.Add(new Item()
            {

                ItemGroup = "Electric",
                ItemDescription = "Electric Sander",
                Quantity = 7,
                UnitPrice = 59.98f,
            });//add list item

 var totalValue = items
            .Select(x => (
                x.ItemDescription,
                x.Quantity,
                x.UnitPrice,
                x.Price = TotalValue((int)x.Quantity, (float)x.UnitPrice)
                ))
            .OrderBy(x => x.Quantity)
            .ToList();//create new list for question 1

         PrintItems(totalValue);//print item (throwing error "can't 
 //convert list to item"

  static void PrintItems(List<Item> items)//print void
    {
        foreach (var Item in items)
        {
            Console.WriteLine("" + Item);
        }
    }

Ответы [ 4 ]

3 голосов
/ 18 октября 2019

Вы используете функцию C # 7 для создания кортежа с помощью LINQ Select, что означает, что у вас больше нет типа List<Item>, но List<yourTupleType>.

Если это все, что вы собираетесь вычислить в своемВыберите, тогда почему бы просто не переместить TotalValue в Item class

public class Item
{
    public string ItemGroup { get; set; }
    public string ItemDescription { get; set; }
    public int Quantity { get; set; }
    public float UnitPrice { get; set; }

    public float Price
    {
        get
        {
            // your TotalValue logic since you already have quantity and unit Price
            // something like
            return Quantity * UnitPrice;
        }
    }
}

, тогда вы можете просто заказать свою коллекцию и перейти к методу PrintItems.

Другой вариант, если вы хотите иметьTotalValue метод вне Item класса - не создавайте новый объект, а просто пересчитывайте цену для каждого элемента.

items.ForEach(i => i.Price = TotalValue((int)x.Quantity, (float)x.UnitPrice));
PrintItems(items.OrderBy(i => i.Quantity).ToList());
2 голосов
/ 18 октября 2019

В C #, когда вы пишете (1, "hello", 1.0f), вы создаете кортеж типа ValueTuple<int, string, float> или короче (int, string, float), и его нельзя использовать взаимозаменяемо с таким классом, как

class NotTuple
{
    public int PropInt { get; set; }
    public string PropString { get; set; }
    public float PropFloat { get; set; }
}

(Потому что они имеют другой тип!)

Поэтому, когда вы делаете

.Select(x => (
       x.ItemDescription,
       x.Quantity,
       x.UnitPrice,
       x.Price = TotalValue((int)x.Quantity, (float)x.UnitPrice)
    ))

, вы создаете IEnumerable<(string, int, float, float)>, а не IEnumerable<Item>. Позже, когда вы вызываете .ToList(), IEnumerable расходуется и материализуется до List<(string, int, float, float)>, который не взаимозаменяем с List<Item>.

2 голосов
/ 18 октября 2019

То, что возвращает ваш оператор Select(), является кортежем. И кортеж не может быть преобразован в предмет

1 голос
/ 18 октября 2019

Можете ли вы пропустить метод PrintItems? если можешь ... сделай это

        List<Item> items = new List<Item>();//create list

    items.Add(new Item()
        {

            ItemGroup = "Electric",
            ItemDescription = "Electric Sander",
            Quantity = 7,
            UnitPrice = 59.98f,
        });//add list item

         var totalValue = items.GroupBy(a => new { a.Quantity, a.ItemDescription, a.UnitPrice })
                  .Select(g => new { g.Key.ItemDescription, g.Key.Quantity, g.Key.UnitPrice,
                                     Price = g.Sum(s => (int)g.Key.Quantity * (float)g.Key.UnitPrice)
                                     });

    foreach (var Item in totalValue)
    {
        Console.WriteLine("" + Item);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...