As to your requirements:
Dim dt AS DataTable = New DataTable()
dt.Columns.Add(New DataColumn("Item", Type.GetType("System.Int32")))
dt.Columns.Add(New DataColumn("Comment", Type.GetType("System.String")))
dt.Rows.Add(New Object(){1, "Reduced BIN-A"})
dt.Rows.Add(New Object(){1, "Cleared BIN-A"})
dt.Rows.Add(New Object(){2, "Reduced BIN-C"})
dt.Rows.Add(New Object(){2, "Reduced BIN-D"})
dt.Rows.Add(New Object(){2, "Reduced BIN-E"})
dt.Rows.Add(New Object(){3, "Reduced BIN-A1"})
dt.Rows.Add(New Object(){3, "Reduced BIN-A1"})
dt.Rows.Add(New Object(){3, "Cleared BIN-A1"})
dt.Rows.Add(New Object(){3, "Reduced BIN-A2"})
dt.Rows.Add(New Object(){3, "Reduced BIN-A2"})
dt.Rows.Add(New Object(){4, "Cleared BIN-A3"})
dt.Rows.Add(New Object(){4, "Reduced BIN-A4"})
dt.Rows.Add(New Object(){4, "Cleared BIN-A4"})
dt.Rows.Add(New Object(){4, "Reduced BIN-A5"})
Dim clearedBins = dt.AsEnumerable() _
.Select(Function(c) New With _
{ _
Key .Item = c.Field(Of Integer)("Item"), _
Key .Action = c.Field(Of String)("Comment").Substring(0, c.Field(Of String)("Comment").IndexOf(" ")), _
Key .Bin = c.Field(Of String)("Comment").Substring(c.Field(Of String)("Comment").IndexOf(" "), _
(c.Field(Of String)("Comment").Length - c.Field(Of String)("Comment").IndexOf(" "))) _
}) _
.GroupBy(Function(a) New With{Key .Bin=a.Bin, Key .Item = a.Item}) _
.Select(Function(g) New With _
{ _
Key .Bin = g.Key.Bin, _
Key .Item = g.Key.Item, _
Key .Action = String.Join(",", g.Select(Function(x) x.Action)) _
}) _
.Where(Function(b) b.Action.Contains("Cleared")) _
.ToList()
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Item", typeof(int)));
dt.Columns.Add(new DataColumn("Comment", typeof(string)));
dt.Rows.Add(new Object[]{1, "Reduced BIN-A"});
dt.Rows.Add(new Object[]{1, "Cleared BIN-A"});
dt.Rows.Add(new Object[]{2, "Reduced BIN-C"});
dt.Rows.Add(new Object[]{2, "Reduced BIN-D"});
dt.Rows.Add(new Object[]{2, "Reduced BIN-E"});
dt.Rows.Add(new Object[]{3, "Reduced BIN-A1"});
dt.Rows.Add(new Object[]{3, "Reduced BIN-A1"});
dt.Rows.Add(new Object[]{3, "Cleared BIN-A1"});
dt.Rows.Add(new Object[]{3, "Reduced BIN-A2"});
dt.Rows.Add(new Object[]{3, "Reduced BIN-A2"});
dt.Rows.Add(new Object[]{4, "Cleared BIN-A3"});
dt.Rows.Add(new Object[]{4, "Reduced BIN-A4"});
dt.Rows.Add(new Object[]{4, "Cleared BIN-A4"});
dt.Rows.Add(new Object[]{4, "Reduced BIN-A5"});
var clearedBins = dt.AsEnumerable()
.Select(c=>new
{
Item = c.Field<int>("Item"),
Action = c.Field<string>("Comment").Substring(0, c.Field<string>("Comment").IndexOf(" ")),
Bin = c.Field<string>("Comment").Substring(c.Field<string>("Comment").IndexOf(" "), (c.Field<string>("Comment").Length - c.Field<string>("Comment").IndexOf(" ")))
})
.GroupBy(a=>new {a.Bin, a.Item})
.Select(g=>new
{
Bin = g.Key.Bin,
Item = g.Key.Item,
Action = string.Join(",", g.Select(x=>x.Action))
})
.Where(b=>b.Action.Contains("Cleared"))
.ToList();
Result:
Bin Item Action
BIN-A 1 Reduced,Cleared
BIN-A1 3 Reduced,Reduced,Cleared
BIN-A3 4 Cleared
BIN-A4 4 Reduced,Cleared
Feel free to change it to your needs.