我有以下DataTable:
Article Price
ART1 99
ART2 100
ART3 150
ART2 90
ART1 50
现在,我应该创建一个新的数据表,其中包含像
这样的重复项的位置Article Duplicates
ART1 1,5
ART2 2,4
ART3
ART2 2,4
ART1 1,5
所以关键是“文章”专栏
我发现只有关于找到哪些是重复值以及使用linq重复这些值的次数的示例。
如何使用linq实现类似的功能?
谢谢
答案 0 :(得分:2)
您可以使用此方法:
var articleLookup = yourTable.AsEnumerable()
.Select((row, index) => new { Row = row, RowNum = index + 1 })
.ToLookup(x=> x.Row.Field<string>("Article"));
DataTable dupTable = new DataTable();
dupTable.Columns.Add("Article");
dupTable.Columns.Add("Duplicates");
foreach(DataRow row in yourTable.Rows)
{
DataRow addedRow = dupTable.Rows.Add();
string article = row.Field<string>("Article");
var dupRowNumList = articleLookup[article].Select(x => x.RowNum).ToList();
string dupRowNumText = dupRowNumList.Count == 1 ? "" : String.Join(",", dupRowNumList);
addedRow.SetField("Article", article);
addedRow.SetField("Duplicates", dupRowNumText);
}
答案 1 :(得分:1)
您好我通过创建列表对象尝试了您的确切要求。我可以得到你需要的预期结果。重要的是你有Linq查询,它会给你结果。 这是Main类
class Program
{
static void Main(string[] args)
{
List<data> datas = new List<data>();
datas.Add(new data() {atricle = "ART1", price = 99});
datas.Add(new data() { atricle = "ART2", price = 100 });
datas.Add(new data() { atricle = "ART3", price = 150 });
datas.Add(new data() { atricle = "ART2", price = 90 });
datas.Add(new data() { atricle = "ART1", price = 50 });
Console.WriteLine($"Atricle | Duplicates");
foreach (data templist in datas)
{
var duplicates = datas.Select((data, index) => new {atricle = data.atricle, Index = index + 1})
.Where(x => x.atricle == templist.atricle)
.GroupBy(pair => pair.atricle)
.Where(g => g.Count() > 1)
.Select(grp => grp.Select(g => g.Index.ToString()).ToArray())
.ToArray();
string joined = duplicates.Length>0 ? string.Join(",", duplicates[0].ToList()):"";
Console.WriteLine($"{templist.atricle} | {joined}");
}
Console.ReadLine();
}
}
这是数据模型类
public class data{
public string atricle { get; set; }
public int price { get; set; }
}