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