DataTable:如何获取重复项及其行号

4

我有一个如下的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

所以关键是“article”列。
我只找到了一些关于使用linq查找重复值并计算值重复次数的示例。
我该如何使用linq实现类似的功能呢?
谢谢。
2个回答

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

你好,我尝试使用创建列表对象的方法来满足您的需求。我能够得到您所需要的预期结果。重要的是您拥有 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; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接