0

次のようなデータがあります。

Name    Update
CC      12/31/2012
CS      12/31/2012
CI      04/30/2013
CR      04/30/2013

この出力が必要です:

Annual CC/CS Update: 12/31/2012
Annual CI/CR Update: 04/30/2013

ただし、私のデータが次のような場合:

Name    Update
CC      12/31/2012
CI      04/30/2013

この出力が必要です:

Annual CC Update: 12/31/2012
Annual CI Update: 04/30/2013

このタスクを達成する方法がわからない。

ところで、ASP.Net MVC3 で Razor を使用する

これを試してみてください:(AllianceDesignationsはDesignation []と定義されていることに注意してください)

<div class="span6">
    @AllianceDesignations.GroupBy(x => x.UpdateDue).Select(g => String.Format("<p>Annual {0} Update: {1}</p>", String.Join("/", g.Select(y => y.Name).ToArray()), g.Key))
</div>

これを示します:

<div class="span6">
    System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Linq.IGrouping`2[System.DateTime,MVC3MyPage.MyPageService.Designation],System.String]
</div>

また、私はすでに次のような別の用途のために辞書にそれらを入れています:

Dictionary<string, Designation> Designations = new Dictionary<string, Designation>();
4

5 に答える 5

1
var designationsByDate = allianceDesignations.GroupBy(designation => designation.UpdateDue).OrderBy(values => values.Key);
string[] rowsOfData = designationsByDate.Select(designationByDate => {
    string annual = designationByDate.Aggregate(string.Empty, (acc, designation) => acc + "/" + designation.Name);
    return string.Format("Annual {0} Update {1}", annual, designationByDate.Key);
}).ToArray();
于 2012-08-29T16:58:13.100 に答える
0

ファイルから読み取っているのかどうかわからず、正確な形式が少しわかりませんが、指定した形式のプレーンテキストファイルから読み取るときに必要なことを正確に実行するためのコードを次に示します。

//used to store converted data
Dictionary<string, string> data = new Dictionary<string, string>();

//open file, read line by line and store values as needed
using (TextReader tr = File.OpenText("test.txt"))
{
    //throw away header line
    string line = tr.ReadLine();
    while ((line = tr.ReadLine()) != null)
    {
        string[] values = line.Split((char[])null, StringSplitOptions.RemoveEmptyEntries);

        if (data.ContainsKey(values[1]))
            data[values[1]] += "/" + values[0];
        else
            data.Add(values[1], values[0]);
    }
}

//print results
foreach (string date in data.Keys)
    Console.WriteLine(String.Format("Annual {0} Update: {1}", data[date], date));

入力:

Name    Update
CS      12/31/12
CI      12/31/12
CL      01/16/13
CS      01/16/13

出力:

Annual CS/CI Update: 12/31/12
Annual CL/CS Update: 01/16/13
于 2012-08-29T17:11:29.640 に答える
0

データ ソースが SQL の場合、次のようなクエリを試すことができます。

select Update , Name
from my_table
order by Update , Name

これで、データが適切に並べられました。次のように、linqなしで、それを読んでグループ化できます。

using ( SqlConnection conn = new SqlConnection( "some connect string" ) )
using ( SqlCommand    cmd  = conn.CreateCommand() )
{
  cmd.CommandText = @"select Update , Name from my_table order by Update , Name" ;
  cmd.CommandType = CommandType.Text ;

  using ( SqlDataReader reader = cmd.ExecuteReader() )
  {
    DateTime     prev_update = DateTime.MinValue ;
    List<string> names       = new List() ;
    while ( reader.Read() )
    {
      DateTime update = reader.GetDateTime( 0 ) ;
      String   name   = reader.GetString(   1 ) ;

      if ( update != prev_update )
      {
        if ( name.Length > 0 )
        {
          Console.WriteLine( "Annual {0} Update: {1}" , string.Join( "/" , names ) , prev_update ) ;
        }
        names.Clear() ;
        prev_update = update ;
      }

      names.Add( name ) ;

    }
    reader.Close() ;
  }
}
于 2012-08-29T16:51:41.710 に答える
0

LINQ のGroupBy 拡張機能を利用できます。レコードを取得したら (クラスが Record であると仮定します)、結果を LINQ 拡張機能でクエリできます。コードは完璧ではないかもしれませんが、正しいアイデアが得られるはずです。

IEnumerable<Record> records = ....
var groups = records.GroupBy( f => f.Update );

foreach( IEnumerable<Record> r in groups ){
  Write( String.Join( "/", r.Select( rec => rec.Name ).ToArray() ), r.First().Update ) );
}
于 2012-08-29T16:32:31.320 に答える
0

最初に でグループ化し Update、次にString.Join各グループの名前 (未テスト):

data.GroupBy(x => x.Update)
    .Select(g => String.Format("Annual {0} Update: {1}", String.Join("/", g.Select(y => y.Name).ToArray()), g.Key)
于 2012-08-29T16:33:11.243 に答える