2016-05-10 3 views
-2

上記三角形の蓄積されたバージョンである:C#のLINQでリストを反復する方法

enter image description here

例の入力データ:

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 }, 
}; 

この例:短い入力ファイルは、次の含まれている場合がありますファイルには2つの三角形が含まれています.1つは「Comp」という製品用で、もう1つは「Non Comp」という製品用です。最初の行には列ヘッダーが含まれ、後続の行にはデータが含まれています。たとえば、1990年にNon-Comp製品で発生した事故、1990年に45.2が支払われた、1991年に64.8が支払われ、1993年に37が支払われたなど。

上記の入力ファイルに対応する出力ファイルは次のようになります。

 
1990, 4 
Comp, 0, 0, 0, 0, 0, 0, 0, 110, 280, 200 
Non-Comp, 45.2, 110, 110, 147, 50, 125, 150, 55, 140, 100 

最初の行は、1990年からに至るまで、この場合には(最も古い原点年(すなわち1990)と開発の年の数を与えます1993すなわち4)。

最初の行の後には、各三角形の行があります。行の最初のフィールドには製品名が表示されます。後続のフィールドは、累積された三角形の値です。

これを達成するために私がこれまで構築してきた2つのクラスです。

Products

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; 
} 

ProductViewModel

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)); 
    } 
} 
+0

これは、スタックオーバーフローには広すぎます。これまでに何を試しましたか? –

+0

私はLinqとグループをオプションで使用しようとしていますが、まだ成功していません。私はリストに保存されたnをインポートしたエクセルシートのデータを持っています ..グループ別製品名オプションで反復する方法が見つかりません – RulezS

+0

@RulezS - この質問を改善する必要があります。サンプルデータをイメージに入れました。このデータをすべて入力せずにソースとして使用することはできません。私たちはあなたのデータエントリーではありません。データをコンパイル可能なC#ソースに置き換えてください。また、データがどのように出力に変換されるかについては説明していません。 '0'は' Comp'のどこから来ますか?そして、タイプの定義を提供せずに 'Product'タイプが使用されていると提案しました。理想的には、たとえ動作していても、試したコードを表示する必要があります。あなたがそれを修正しない限り、この質問は閉じられるでしょう。 – Enigmativity

答えて

0

あなたがその出力のようなあなたは以下のようなチェーンいくつかのLINQのできることをしたい場合。

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

ここから結果を繰り返して、目的の出力を得ることができます。

+0

これは本当にありがとうございます。これは私にとっても完璧に機能します。 – RulezS

+0

恐ろしい!最後のカンマを削除するように更新しました。 –

関連する問題