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()));