2015-06-23 58 views
-2

我正在生成一組記錄,其中每條記錄都由三個字符串組成。生成的記錄數量是動態的,因爲用戶可以儘可能多地添加它們。C#在匹配上連接字符串的記錄

我需要通過一組記錄,並根據三個字符串中的兩個字符串和第三個字符串連接生成/合併記錄。我知道這可能不是很清楚,但我提供了用戶的一組記錄樣本日期以及我需要的結果。

記錄由用戶產生的:

記錄1: 「AAA」, 「BBB」, 「DEF」

記錄2: 「AAA」, 「BBB」, 「QEW」

記錄3: 「RRR」, 「WWW」, 「123」

記錄4: 「RRR」, 「WWW」, 「321」

記錄5: 「XXX」, 「WWW」, 「421」

結果我需要:

記錄1: 「AAA」, 「BBB」, 「DEFQEW」

記錄2: 「RRR」, 「WWW」, 「123321」

記錄3: 「XXX,」 WWW」, 「421」

此外,我應該如何存儲記錄來操縱日期,因爲我想要?

我不熟悉LINQ,所以如果你建議我會欣賞一些例子。謝謝!

編輯

我從一個數據行循環產生的字符串。我可以像列表(字符串)或任何你建議的那樣存儲它們。

+0

什麼樣的記錄?這是Linq-To-Objects還是數據庫驅動的提供者? –

+0

string a =「aaa」 string b =「bbb」 string c =「def」 簡單的字符串變量 – Dav

回答

2

如果它是一個IEnumerable<CustomType>其中CustomType是具有三個屬性的類:

var result = records 
    .GroupBy(x => new { x.Prop1, x.Prop2 }) 
    .Select(g => new CustomType 
    { 
     Prop1 = g.Key.Prop1, 
     Prop2 = g.Key.Prop2, 
     Prop3 = String.Join(", ", g.Select(x => x.Prop3)) 
    }); 

如果是像現在在你的問題中提到一個DataTable

var result = table.AsEnumerable() 
    .GroupBy(row => new { Col1 = row.Field<string>(0), Col2 = row.Field<string>(1) }) 
    .Select(g => new 
    { 
     Col1 = g.Key.Col1, 
     Col2 = g.Key.Col2, 
     Col3 = String.Join(", ", g.Select(row => row.Field<string>(2))) 
    }); 
+0

感謝數據表的回答給了我很多幫助。將更新與解決方案的問題。 – Dav

4

沒有更多的上下文,很難提出最佳解決方案。一個簡單的LINQ GroupBy可能達到目的:

// Assuming that each array has exactly 3 elements 
IEnumerable<string[]> records; // Initialize this 
var groupedRecords = records 
    .GroupBy(
     // Group the records by the two first values 
     r => new { a = r[0], b = r[1] }, 

     // Concatenate the matching records 
     (k, g) => new { k.a, k.b, string.Join("", g.Select(r => r[2]) } 
    ); 

在這個例子中我假設每個記錄是簡單地3個元素的陣列。您可能會想要創建一個能夠正確表示記錄的類型,但代碼應該很簡單以適應。

+0

是的,總是有四個字符串,但是使事情變得更簡單。我需要將每個記錄存儲在一個數組中(這將保存三個字符串),然後將記錄存儲在另一個數組中。那是對的嗎?一個數組字符串的數組? – Dav

+0

如果您使用的是DataTable,則可以輕鬆地重用此代碼。沒有必要在其他地方複製數據。 @Tim Schmelter的答案與我的相同,並說明如何做到這一點。感謝隊友 –

+0

,它工作。只需要更多的解釋。 – Dav

1

試試這個

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 


namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("Col1", typeof(string)); 
      dt.Columns.Add("Col2", typeof(string)); 
      dt.Columns.Add("Col3", typeof(string)); 

      dt.Rows.Add(new object[] {"AAA","BBB","DEF"}); 
      dt.Rows.Add(new object[] {"AAA","BBB","QEW"}); 
      dt.Rows.Add(new object[] {"RRR","WWW","123"}); 
      dt.Rows.Add(new object[] {"RRR","WWW","321"}); 
      dt.Rows.Add(new object[] {"XXX","WWW","421"}); 

      var results = dt.AsEnumerable() 
       .GroupBy(x => new {col1 = x.Field<string>("Col1"), col2 = x.Field<string>("Col2") }) 
       .Select(x => new { 
        col1 = x.FirstOrDefault().Field<string>("Col1"), 
        col2 = x.FirstOrDefault().Field<string>("Col2"), 
        col3 = string.Join("",x.Select(y => y.Field<string>("Col3")).ToArray()) 
       }) 
       .ToList(); 

     } 
    } 
} 
​ 
+0

感謝它的工作。自從他首先回答以後,我會給予最好的回答。但是,謝謝你給出了一個很好的解釋。 – Dav

0
// here's the solution thanks to jdweng and Tim - I adjusted it to work with 5 columns based on 3 columns. 
var result = toDisplay.AsEnumerable() 
      .GroupBy(x => new { Col1 = x.Field<string>("rItem"), 
           Col2 = x.Field<string>("rMaterial"), 
           Col3 = x.Field<string>("rSpecs")}) 
      .Select(g => new 
      { 
       Col1 = g.Key.Col1, 
       Col2 = g.Key.Col2, 
       Col3 = g.Key.Col3, 
       Col4 = String.Join(", ", g.Select(row => row.Field<string>("rQuantity"))), 
       Col5 = String.Join(", ", g.Select(row => row.Field<string>("rOptional"))), 
      });