4

私は次の仕事に苦労しています。任意の提案をいただければ幸いです!

以下のようなPersonオブジェクトのリストがあります。

public class Person {
     private string firstname {get; set}
     private string lastname {get; set}
     private string zipcode {get; set;}
     private string id {get; set;}
     private int freq = 1;

     public Person(...) {...}
}

List<Person> PersonList = new List<Person>; //Gets populated with Person objects

郵便番号内に一意の名前を持つすべての人を見つけたいです。

これまで、(名、姓、郵便番号)のすべての異なる組み合わせに対して頻度カウントを実行し、頻度= 1の組み合わせを選択しようとしましたが、これらの人々のIDに関するすべての情報が失われます。グループ化操作にもかかわらず、元のPersonオブジェクトを保持する方法が必要です。

以下は私が上で述べた頻度カウントですが、それは私が探している結果ではありません:

var QueryFreqAnalysis =
                        from p in PersonList
                        group p by new { p.firstName, p.lastName, p.zipcode } into g
                        select new {
                            fName = g.Key.firstname,
                            lName = g.Key.lastname,
                            zip3 = g.Key.zipcode,
                            freq = g.Sum(p => p.freq)
                        };

前述したように、freq = 1のg内のグループを選択できるようになりましたが、個人IDに関するすべての情報が失われました。

問題を明確にしたと思います。提案を事前に感謝します!

4

2 に答える 2

5
from p in PersonList
// Group by name and zip
group p by new { p.firstName, p.lastName, p.zipcode } into g
// Only select those who have unique names within zipcode
where g.Count() == 1
// There is guaranteed to be one result per group: use it
let p = g.FirstOrDefault()
select new {
    fName = p.firstname,
    lName = p.lastname,
    zip3 = p.zipcode,
    id = p.id
}
于 2012-07-05T23:35:48.877 に答える
1

私はあなたがおそらくlinqの答えだけを必要とし、望んでいることを知っています:)
しかし、私はlinq以外のものを書かなければなりませんでした:

var dict = new Dictionary<string, Person>(PersonList.Count);

        var uniqueList = new List<Person>();

        foreach (var p in PersonList)
        {
            var key = p.firstname + p.lastname + p.zipcode;
            if (!dict.ContainsKey(key))
                dict.Add(key, p);
            else
                dict[key] = null;
        }

        foreach (var kval in dict)
        {
            if (kval.Value != null)
                uniqueList.Add(kval.Value);
        }

        return uniqueList;

ハッシュコードの使用も可能です。

于 2012-07-06T00:30:10.987 に答える