1

重複レコードをユーザーに表示してデータを修正するか、重複行を削除するプログラムを作成しようとしています。それは機能しますが、これを機能させるには、ラムダ式に Where 句を入れる必要がありました。この無用な句を削除するにはどうすればよいですか?

Where(d => d.Id > 0)は 22 行目です。

public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            List<Person> dt = new List<Person>();
            dt.Add(new Person() { Id = 1, Name = "MICHAEL JACKSON", Age = 50 });
            dt.Add(new Person() { Id = 2, Name = "MICHAEL JACKSON", Age = 51 });
            dt.Add(new Person() { Id = 3, Name = "JOHN LENNON", Age = 40 });
            dt.Add(new Person() { Id = 4, Name = "JOHN LENNON", Age = 41 });
            dt.Add(new Person() { Id = 5, Name = "ELVIS PRESLEY", Age = 42 });

            var duplicates = dt.AsEnumerable().GroupBy(r => r.Name).Where(gr => gr.Count() > 1).ToList();
            if (duplicates.Any())
            {
                var query = duplicates.SelectMany(c => c.Where(d => d.Id > 0)).AsQueryable();

                foreach (var item in query)
                    Console.WriteLine(String.Format("{0} - {1}", item.Name, item.Age));
            }
            else
                Console.WriteLine("No records duplicates.");

            Console.ReadLine();
        }
    }

これは単なるサンプル コードです。私のコードは他の多くのチェックを行いますが、誰かがこの句を削除する方法を知っていれば、非常に役に立ちます。パフォーマンスに影響を与える可能性があると思います。

4

3 に答える 3

2

これはここでも機能します:

    List<Person> dt = new List<Person>();
    dt.Add(new Person() { Id = 1, Name = "MICHAEL JACKSON", Age = 50 });
    dt.Add(new Person() { Id = 2, Name = "MICHAEL JACKSON", Age = 51 });
    dt.Add(new Person() { Id = 3, Name = "JOHN LENNON", Age = 40 });
    dt.Add(new Person() { Id = 4, Name = "JOHN LENNON", Age = 41 });
    dt.Add(new Person() { Id = 5, Name = "ELVIS PRESLEY", Age = 42 });

    var duplicates = dt.GroupBy(r => r.Name).Where(gr => gr.Count() > 1).ToList();
    if (duplicates.Any())
    {

        foreach (var item in duplicates)
            Console.WriteLine(String.Format("{0} - {1}", item.Key, string.Join(",", item.Select(p => p.Age))));
    }
    else
        Console.WriteLine("No records duplicates.");

    Console.ReadLine();
于 2012-12-13T17:21:04.827 に答える
1

それduplicatesはオブジェクトによってグループ化されているためです。名前だけを表示したい場合は、これを試してください:

var query = duplicates.Select(c => c.Key);
foreach (var item in query)
    Console.WriteLine(String.Format("{0}", item));

繰り返し年齢を表示したい場合は、これを試してください:

var query = duplicates.SelectMany(i => i);
foreach (var item in query)
    Console.WriteLine(String.Format("{0} - {1}", item.Name, item.Age));
于 2012-12-13T17:19:55.010 に答える
1

これは私にとってはうまくいきます。

            var query = duplicates.SelectMany(c => c).AsQueryable();
于 2012-12-13T17:22:23.877 に答える