C# DataTable:如何获取副本和副本的行号
我有以下数据表:C# DataTable:如何获取副本和副本的行号,c#,linq,datatable,C#,Linq,Datatable,我有以下数据表: Article Price ART1 99 ART2 100 ART3 150 ART2 90 ART1 50 现在,我应该创建一个新的datatable,其中包含重复项的位置 Article Duplicates ART1 1,5 ART2 2,4 ART3 ART2 2,4 ART1
Article Price
ART1 99
ART2 100
ART3 150
ART2 90
ART1 50
现在,我应该创建一个新的datatable,其中包含重复项的位置
Article Duplicates
ART1 1,5
ART2 2,4
ART3
ART2 2,4
ART1 1,5
所以关键是“文章”栏
我只找到了关于查找哪些是重复值以及使用linq重复值的次数的示例
我怎样才能用linq实现这样的目标
谢谢您可以使用以下方法:
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);
}
var-articleLookup=yourTable.AsEnumerable()
.Select((行,索引)=>new{row=row,RowNum=index+1})
.ToLookup(x=>x.Row.Field(“文章”);
DataTable dupTable=新DataTable();
可复制。列。添加(“条款”);
dupTable.Columns.Add(“重复项”);
foreach(表中的DataRow行。行)
{
DataRow addedRow=dupTable.Rows.Add();
string article=行字段(“article”);
var dupRowNumList=articleLookup[article]。选择(x=>x.RowNum.ToList();
字符串dupRowNumText=dupRowNumList.Count==1?“:string.Join(“,”,dupRowNumList);
增编:设定域(“第条”,第条);
addedRow.SetField(“副本”,dupRowNumText);
}
您好,我尝试了您的确切要求,创建了一个列表对象。我可以得到你要求的预期结果。重要的是,您有Linq查询,它将为您提供结果。
这是主课
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; }
}