如何在LINQ语句中使用.ForEach?

时间:2014-07-08 17:44:48

标签: c# xml linq

我正在尝试迭代OrderItems列表并将结果与​​我的Order Element相关联。通过这个论坛的帮助,我能够使协会正确地工作并且#34;当我的订单元素下只有一个OrderItem时。但是当我的订单元素下有多个OrderItem时,我无法开始工作。

我看了很多线程,显示.ForEach(x =>语法并看到了ToList()建议但是我没有发现任何类似于我正在做的事情来弄清楚是什么我需要这样做。我很确定我需要.ForEach围绕我的​​

OrderItems = new List<OrderItems>()

但我不确定如何应用它。

编辑澄清我的问题 - 下面的XML中有两个订单。第一个订单有一个项目,即Silver Widget。第二个订单有两个项目,分别是Gold和Blue Widget。但是当我运行这个程序时,我只得到第2个订单的第一项。我真的在问我如何让它们在订单下显示出来?

ID: 1 OrderDate: 7/7/2014 12:00:00 AM OrderTotal: 12.99
        ProductName: Silver Widgets
        Price: 12.99
        Quantity: 1
ID: 2 OrderDate: 7/7/2014 12:00:00 AM OrderTotal: 20.00
        ProductName: Gold Widgets
        Price: 10.00
        Quantity: 1

以上是代码中Console.WriteLines的结果..

    static void Main()
    {
        XDocument document = XDocument.Parse(GetXml());

        var query = from el in document.Root.Elements("Order")
                    select new Orders
                    {
                        Id = (int)el.Element("Id"),
                        OrderDate = (DateTime)el.Element("OrderDate"),
                        OrderTotal = (Decimal)el.Element("OrderTotal"),

                        OrderItems = new List<OrderItems>()
                        {
                            new OrderItems()
                            { 
                                ProductName = (string)el.Element("OrderItems").Element("OrderItem").Element("ProductName"), 
                                Price = (Decimal)el.Element("OrderItems").Element("OrderItem").Element("Price"),
                                Quantity = (int)el.Element("OrderItems").Element("OrderItem").Element("Quantity")
                            }
                        }
                    };

        foreach (var cc in query)
        {
            Console.WriteLine(String.Format("ID: {0} OrderDate: {1} OrderTotal: {2}"
                , cc.Id
                , cc.OrderDate
                , cc.OrderTotal));
            foreach (var xx in cc.OrderItems)
            {
                Console.WriteLine("\tProductName: " + cc.OrderItems[0].ProductName);
                Console.WriteLine("\tPrice: " + cc.OrderItems[0].Price);
                Console.WriteLine("\tQuantity: " + cc.OrderItems[0].Quantity);
            }
        }

        Console.ReadLine();

    }

    public static String GetXml()
    {
        return @"<?xml version='1.0' encoding='utf-8' ?>
        <OrderXml>
          <Order>
            <Id>1</Id>
            <OrderDate>7/7/2014</OrderDate>
            <OrderTotal>12.99</OrderTotal>
            <OrderItems>
              <OrderItem>
                <ProductName>Silver Widgets</ProductName>
                <Price>12.99</Price>
                <Quantity>1</Quantity>
              </OrderItem>
            </OrderItems>
          </Order>
          <Order>
            <Id>2</Id>
            <OrderDate>7/7/2014</OrderDate>
            <OrderTotal>20.00</OrderTotal>
            <OrderItems>
              <OrderItem>
                <ProductName>Gold Widgets</ProductName>
                <Price>10.00</Price>
                <Quantity>1</Quantity>
              </OrderItem>
              <OrderItem>
                <ProductName>Blue Widgets</ProductName>
                <Price>10.00</Price>
                <Quantity>1</Quantity>
              </OrderItem>
            </OrderItems>
          </Order>
        </OrderXml>";
    }

3 个答案:

答案 0 :(得分:3)

您根本不想在此使用ForEach(或foreach)。

您有XElement代表您的OrderItems元素。它有一些OrderItem子元素。您需要做的是获取这些子元素的集合(您可以使用Elements方法执行)并将该集合转换为自定义项的集合。转换项目序列是Select的作业,而不是ForEach

OrderItems = el.Element("OrderItems")
    .Elements("OrderItem")
    .Select(orderItem => new OrderItem()
    {
        ProductName = (string)orderItem.Element("ProductName"),
        Price = (decimal)orderItem.Element("Price"),
        Quantity = (int)orderItem.Element("Quantity"),
    })
    .ToList(),

答案 1 :(得分:0)

添加ForEach&#34;运营商&#34; LINQ是一个常见的用户扩展,但默认情况下它不在LINQ中。

通常的方法是贪婪地遍历调用不返回结果的委托的每个值。

虽然迭代类似,但它与foreach关键字没有其他关系。

答案 2 :(得分:0)

Microsoft决定不实施.ForEach extension for IEnumerable

但你可以实现自己的:

public static class Extensions
{
    public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (action == null) throw new ArgumentNullException("action");

        foreach (T item in source)
        {
            action(item);
        }
    }
}

像魅力一样。

另外,您需要实施@Servy中的其他建议。