2012-08-29 60 views
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

尝试此:(注AllianceDesignations被定义指定[])

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

不能评论张贴代码。但我有什么不正确的。 – MB34

+3

请勿在评论中发布 - 编辑问题。 –

+0

你的数据格式是什么?一个CSV?数据库?文件中的扁平字符串?一个textarea? –

回答

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

不能将类型'System.Collections.Generic.IEnumerable '隐式转换为'string []'。 – MB34

+0

@ MB34对不起,我忘了.ToArray();最后,修复。 –

+0

我刚做了rowsOfData IEnumerable 。现在,我怎样去除指定中的DateTime值的时间部分?每次我尝试使用该值的格式时,都会收到明确的转换错误。 – MB34

0

您可以利用LINQ的GroupBy extension。一旦你找回了你的记录(让我们假设你的课程是记录),你可以查询你的结果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)); 
} 
+0

不是来自数据库。 – MB34

+3

@ MB34:您不需要使用数据库来使用LINQ。 –

+0

在尝试此操作时,出现错误“无法在声明之前使用局部变量r”在r.Select – MB34

0

首先group byUpdate,然后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) 
+0

查看原始问题中的新数据。 – MB34

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