1

私のプロジェクトでは、重大な問題が発生しています。コレクション内のすべてEmployeeの のコレクションがあります。のいくつかはEmployee同じLNameです:

public class Employee
{
    public int ID { get; set; }
    public string FName { get; set; }
    public string MName { get; set; }
    public string LName { get; set; }
    public DateTime DOB { get; set; }
    public char Gender { get; set; }
}

public class MyClass
{
    public List<Employee> GetAll()
    {
        List<Employee> empList = new List<Employee>();
        empList.Add(new Employee()
        {
            ID = 1,
            FName = "John",
            MName = "",
            LName = "Shields",
            DOB = DateTime.Parse("12/11/1971"),
            Gender = 'M'
        });
        empList.Add(new Employee()
        {
            ID = 2,
            FName = "Mary",
            MName = "Matthew",
            LName = "Jacobs",
            DOB = DateTime.Parse("01/17/1961"),
            Gender = 'F'
        });
        empList.Add(new Employee()
        {
            ID = 3,
            FName = "Amber",
            MName = "Carl",
            LName = "Agar",
            DOB = DateTime.Parse("12/23/1971"),
            Gender = 'M'
        });
        empList.Add(new Employee()
        {
            ID = 4,
            FName = "Kathy",
            MName = "",
            LName = "Foxsss",
            DOB = DateTime.Parse("11/15/1976"),
            Gender = 'F'
        });
        empList.Add(new Employee()
        {
            ID = 5,
            FName = "Lena",
            MName = "Ashco",
            LName = "Bilton",
            DOB = DateTime.Parse("05/11/1978"),
            Gender = 'F'
        });
        empList.Add(new Employee()
        {
            ID = 6,
            FName = "Susanne",
            MName = "",
            LName = "Buck",
            DOB = DateTime.Parse("03/7/1965"),
            Gender = 'F'
        });
        empList.Add(new Employee()
        {
            ID = 7,
            FName = "Jim",
            MName = "",
            LName = "Hooks",
            DOB = DateTime.Parse("09/11/1972"),
            Gender = 'M'
        });
        empList.Add(new Employee()
        {
            ID = 8,
            FName = "Jane",
            MName = "G",
            LName = "Hooks",
            DOB = DateTime.Parse("12/11/1972"),
            Gender = 'F'
        });
        empList.Add(new Employee()
        {
            ID = 9,
            FName = "Robert",
            MName = "",
            LName = "Fox",
            DOB = DateTime.Parse("06/28/1964"),
            Gender = 'M'
        });
        empList.Add(new Employee()
        {
            ID = 10,
            FName = "Cindy",
            MName = "Preston",
            LName = "Fox",
            DOB = DateTime.Parse("01/11/1978"),
            Gender = 'M'
        });

        return empList;
    }
}

LNameLINQ を使用してコレクションから重複レコード (に基づく) を取得するにはどうすればよいですか?

4

2 に答える 2

6

明確ではありませんが、次を探しているようです:

var duplicates = GetAll().GroupBy(x => x.LName)
                         .Where(g => g.Count() > 1)
                         .SelectMany(g => g)
                         .ToList()

要素をLNameでグループ化し、複数の要素を持つグループのみを取得してリストとして返します。

duplicatesとなりますList<Employee>

ToDictionaryの代わりに使用すると、少し改善できますToList

var duplicates = GetAll().GroupBy(x => x.LName)
                         .Where(g => g.Count() > 1)
                         .ToDictionary(g = > g.Key, g.ToList());

Dictionary<string, List<Employee>>LName辞書キーとして 、および として与えられたアイテムのリストにLNameなりますValue

于 2013-07-31T12:52:02.013 に答える
1

特定のキーを完全にカウントする必要はありません。実際にはもう少し効率的で、重複があることの意味を明確に表現できます。重複を確認するには、最初の項目をスキップした後、残りがあるかどうかを確認するだけです。

var duplicates = GetAll().GroupBy(x => x.LName)
                         .Where(g => g.Skip(1).Any())
                         .SelectMany(g => g);

必要に応じて、これをリストに変換できますToList。または、次のように言うことができます。

var duplicates = GetAll().GroupBy(x => x.LName)
                         .Where(g => g.Skip(1).Any())
                         .ToLookup(g => g.Key);

によって収集されEmployee.LNameます。

于 2013-07-31T13:01:27.383 に答える