2012-07-05 3 views
4

다음 작업으로 어려움을 겪고 있습니다. 어떤 제안이라도 대단히 감사하겠습니다! 나는 그들의 우편 번호 내에서 고유 한 이름을 가진 모든 사람을 찾으려면LINQ : 빈도가 1 인 목록에서 항목을 찾습니다.

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 객체를 유지할 방법이 필요합니다. = 내가 주파수를 g 내에서 현재 선택 그룹을 가질 수에도 불구하고, 내가 언급 한 바와 같이

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) 
         }; 

: 아래

내가 위에서 언급 한 주파수 카운트이지만, 내가 찾고 결과가 아니다 1, 나는 개인 ID에 관한 모든 정보를 잃어 버렸습니다.

나는이 문제를 분명히하기를 바랍니다. 미리 제안 해 주셔서 감사합니다.

답변

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 
} 
+2

나는 select new ...를 선택하는 것이 좋습니다. –

+0

그게 바로 제가 원했던 것입니다. 당신의 관대 한 도움에 너무 감사드립니다! FirstOrDefault() 함수를 알지 못했습니다 ... 매우 도움이되었습니다! – lisa

+0

Erez Robinson : btw, Person 개체에서 "freq"필드를 제거하고 "select p ..."로 "select new ..."를 바꾸려면 제안을 사용했습니다. 고마워! – lisa

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; 

을 해시 코드를 사용하는 것도 가능하다.

+0

감사합니다. StriplingWarrior가 게시 한 LINQ 솔루션을 사용할 예정이지만 도움을 주셔서 감사합니다 :) – lisa

관련 문제