Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C LINQ中迭代列表_C#_Linq - Fatal编程技术网

C# 如何在C LINQ中迭代列表

C# 如何在C LINQ中迭代列表,c#,linq,C#,Linq,上述三角形的累积版本为: 输入数据示例:短输入文件可能包含以下内容: var products = new List<Products>() { new Products { ProductName = "Comp", OriginYear = 1992, DevelopmentYear = 1992, IncrementalValue = 110.0 }, new Products { ProductName = "Comp", OriginYear = 1992,

上述三角形的累积版本为:

输入数据示例:短输入文件可能包含以下内容:

var products = new List<Products>()
{
    new Products { ProductName = "Comp", OriginYear = 1992, DevelopmentYear = 1992, IncrementalValue = 110.0 },
    new Products { ProductName = "Comp", OriginYear = 1992, DevelopmentYear = 1993, IncrementalValue = 170.0 },
    new Products { ProductName = "Comp", OriginYear = 1993, DevelopmentYear = 1993, IncrementalValue = 200.0 },
    new Products { ProductName = "Non-Comp", OriginYear = 1990, DevelopmentYear = 1990, IncrementalValue = 45.2 },
    new Products { ProductName = "Non-Comp", OriginYear = 1990, DevelopmentYear = 1991, IncrementalValue = 64.8 },
    new Products { ProductName = "Non-Comp", OriginYear = 1990, DevelopmentYear = 1993, IncrementalValue = 37.0 },
    new Products { ProductName = "Non-Comp", OriginYear = 1991, DevelopmentYear = 1991, IncrementalValue = 50.0 },
    new Products { ProductName = "Non-Comp", OriginYear = 1991, DevelopmentYear = 1992, IncrementalValue = 75.0 },
    new Products { ProductName = "Non-Comp", OriginYear = 1991, DevelopmentYear = 1993, IncrementalValue = 25.0 },
    new Products { ProductName = "Non-Comp", OriginYear = 1992, DevelopmentYear = 1992, IncrementalValue = 55.0 },
    new Products { ProductName = "Non-Comp", OriginYear = 1992, DevelopmentYear = 1993, IncrementalValue = 85.0 },
    new Products { ProductName = "Non-Comp", OriginYear = 1993, DevelopmentYear = 1993, IncrementalValue = 100.0 },
};
ProductViewModel:


如果您想要这样的输出,您可以像下面这样链接一些Linq

IEnumerable<string> result = products
   .GroupBy(x => x.ProductName)
   .Select(product 
        => product.Key
           + new string(product
                       .SelectMany(x 
                                => ", " + x.IncrementalValue.ToString(CultureInfo.CurrentCulture))
                                    .ToArray()));

从这里,您可以迭代结果以获得所需的输出。

这对于堆栈溢出来说太宽了。到目前为止,您尝试了什么?我一直在尝试使用Linq和group by option,但还没有成功。我在excel表格中得到了数据,我已导入并保存在列表中。。找不到按产品名称分组迭代的方法option@RulezS-你需要改进这个问题。您在图像中提供了示例数据-如果不全部键入,我们无法将此数据用作源-我们不是您的数据输入临时工。请将该图像替换为数据的可编译C源代码。您还没有解释数据是如何转换为输出的。Comp中的所有0都来自哪里?您建议使用类型产品,但没有提供类型的定义。理想情况下,您应该显示您尝试过的代码,即使它是否有效。这个问题将被关闭,除非你解决它。数据是excel格式的,我已经导入到我的datagrid中。我有一个我用来绑定数据的产品类。数据将保存在列表中。样本数据为产品、起源年、开发年、增量值比较,1992、1992、110.0比较、1992、1993、170.0比较、1993、1993、200.0非比较、1990、1990、45.2非比较、1990、1991、64.8非比较、1990、1993、37.0非比较、1991、1991、50.0非比较、1991、1992、75.0非比较、1991、1993、25.0非比较、1992、1992、,55.0非公司,1992年,1993年,85.0非公司,1993年,1993年,100年。0@RulezS:这应该让你开始:非常感谢你的帮助。这对我也很有效。
public class Products : INotifyPropertyChanged
{
    string _ProductName;
    int _OriginYear;
    int _DevelopmentYear;
    double _IncrementalValue;

    public string ProductName
    {
        get
        {
            return _ProductName;
        }
        set
        {
            if (_ProductName != value)
            {
                _ProductName = value;
                RaisePropertyChanged("ProductName");
            }
        }
    }

    public int OriginYear
    {
        get
        {
            return _OriginYear;
        }
        set
        {
            if (_OriginYear != value)
            {
                _OriginYear = value;
                RaisePropertyChanged("OriginYear");
            }
        }
    }

    public int DevelopmentYear
    {
        get
        {
            return _DevelopmentYear;
        }
        set
        {
            if (_DevelopmentYear != value)
            {
                _DevelopmentYear = value;
                RaisePropertyChanged("DevelopmentYear");
            }
        }
    }

    public double IncrementalValue
    {
        get
        {
            return _IncrementalValue;
        }
        set
        {
            if (_IncrementalValue != value)
            {
                _IncrementalValue = value;
                RaisePropertyChanged("IncrementalValue");
            }
        }
    }

    void RaisePropertyChanged(string prop)
    {
        if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(prop)); }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}
class ProductViewModel
{
    OleDbConnection Conn;
    OleDbCommand Cmd;
    List<Products> Productsobj;

    public ProductViewModel()
    {
        string ExcelFilePath = @"ProductData.xlsx";
        string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 12.0;Persist Security Info=True";
        Conn = new OleDbConnection(excelConnectionString);
    }
    /// <summary>  
    /// Method to Get All the Records from Excel  
    /// </summary>  
    /// <returns></returns>  
    public async Task<List<Products>> ReadRecordFromEXCELAsync()
    {
        Productsobj = new List<Products>();
        await Conn.OpenAsync();
        Cmd = new OleDbCommand();
        Cmd.Connection = Conn;
        Cmd.CommandText = "Select * from [Sheet1$]";
        var Reader = await Cmd.ExecuteReaderAsync();
        while (Reader.Read())
        {
            Productsobj.Add(new Products()
            {
                ProductName = Reader["Product"].ToString(),
                OriginYear = Convert.ToInt32(Reader[" Origin Year"]),
                DevelopmentYear = Convert.ToInt32(Reader[" Development Year"]),
                IncrementalValue = Convert.ToDouble(Reader[" Incremental Value"])
            });
        }
        Reader.Close();
        Conn.Close();

        return Productsobj;
    }

    public void DisplayData()
    {
        int maxYear = Productsobj.Max(t => t.OriginYear);
        int minYear = Productsobj.Min(t => t.OriginYear);
        DateTime max = new DateTime(maxYear, 1, 1);
        DateTime min = new DateTime(minYear, 1, 1);
        int years = Years(min, max);
    }

    public int Years(DateTime start, DateTime end)
    {
        return (end.Year - start.Year) +
            (((end.Month > start.Month) ||
            ((end.Month == start.Month) && (end.Day >= start.Day))) ? 1 : 0);
    }

    public void CalculateAccumulativeData()
    {
        var paymentdata = from p in Productsobj
                          group p.ProductName by new { };

        foreach (var data in paymentdata)
        {
            System.Diagnostics.Debug.WriteLine(data.Key);
            foreach (var listing in data)
            {
                System.Diagnostics.Debug.WriteLine("\t{0}", listing);
            }
        }
        Productsobj.ForEach(item => System.Diagnostics.Debug.WriteLine(item.OriginYear + "," + item.IncrementalValue));
    }
}
IEnumerable<string> result = products
   .GroupBy(x => x.ProductName)
   .Select(product 
        => product.Key
           + new string(product
                       .SelectMany(x 
                                => ", " + x.IncrementalValue.ToString(CultureInfo.CurrentCulture))
                                    .ToArray()));