DataTable:如何获取重复项的重复项和行号

时间:2017-09-15 12:49:30

标签: c# linq datatable

我有以下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实现类似的功能?

谢谢

2 个答案:

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