문제

나는있다 Person 수업 Name 그리고 AreaID 속성.

public class Person
{
   public string Name;
   public int AreaID;

   // snip
}

나는있다 List<Person> 목록에 수백 명의 사람 객체에 대한 잠재력이 있습니다. 예를 들어, AreaID = 1 및 100 명을 가진 100 명 = 2

나는 AreaID의 뚜렷한 목록과 그 지역을 가진 사람의 수를 반환하고 싶습니다.

예를 들어, atreaID = 1 사람 = 100 areaID = 2 사람 = 100

도움이 되었습니까?

해결책

Area ID별로 그룹화하고 싶은 것 같습니다.

var groups = from person in persons
             group 1 by person.AreaID into area
             select new { AreaID = area.Key, Persons = area.Count() };

나는 "그룹 1"을 사용하여 각 그룹 내의 데이터에 관심이 없음을 나타냅니다. 카운트와 키만.

이것은 그룹화를 위해 모든 결과를 버퍼링해야한다는 점에서 비효율적입니다. .NET 4.0에서 반응성 LINQ를 사용하여보다 효율적으로 수행하거나 확실히 사용할 수 있습니다. Linq를 푸시합니다 원한다면. 다시 말하지만, 비교적 작은 데이터 세트의 경우 아마도 중요하지 않을 것입니다 :)

다른 팁

GroupBY 메소드를 사용하십시오.

var list = ...list of Persons...

var areas = list.GroupBy( p => p.AreaID )
                .Select( g => new {
                    AreaID = g.Key,
                    Count = g.Count()
                 });

놀랍게도 아무도 무시할 것을 권고하지 않았습니다 Equals 그리고 GetHashCode. 그렇게한다면 폴링을 할 수 있습니다.

 List<Person> unique = personList.Distinct();

또는

 List<Person> areaGroup = personList.GroupBy(p => p.AreaID);
 List<Person> area1Count = personList.Where(p => p.AreaID == 1).Count();

이것은 당신에게 더 많은 유연성을 제공합니다 - 쓸모없는 익명 수업은 필요하지 않습니다.

return list.GroupBy(p => p.AreaID)
    .Select(g => new { AreaID = g.Key, People = g.Count() });

당신은 사용할 수 있습니다 list.GroupBy(x => x.AreaID);

당신은 이것을 시도 할 수 있습니다 :

var groups = from person in list
             group person by person.AreaID into areaGroup
             select new {
                 AreaID = areaGroup.Key,
                 Count = areaGroup.Count()
             };
        var people = new List<Person>();

        var q = from p in people
                group p by p.AreaId into g
                select new { Id = g.Key, Total = g.Count() };


        people.Add(new Person { AreaId = 1, Name = "Alex" });
        people.Add(new Person { AreaId = 1, Name = "Alex" });
        people.Add(new Person { AreaId = 2, Name = "Alex" });
        people.Add(new Person { AreaId = 3, Name = "Alex" });
        people.Add(new Person { AreaId = 3, Name = "Alex" });
        people.Add(new Person { AreaId = 4, Name = "Alex" });
        people.Add(new Person { AreaId = 2, Name = "Alex" });
        people.Add(new Person { AreaId = 4, Name = "Alex" });
        people.Add(new Person { AreaId = 1, Name = "Alex" });

        foreach (var item in q)
        {
            Console.WriteLine("AreaId: {0}, Total: {1}",item.Id,item.Total);
        }

아마도 이런거?

            List<Person> persons = new List<Person> ();
            persons.Add (new Person (1, "test1"));
            persons.Add (new Person (1, "test2"));
            persons.Add (new Person (2, "test3"));

            var results = 
                persons.GroupBy (p => p.AreaId);

            foreach( var r in results )
            {
                Console.WriteLine (String.Format ("Area Id: {0} - Number of members: {1}", r.Key, r.Count ()));
            }

            Console.ReadLine ();

뚜렷한 대신 사용됩니다 그룹비, 또는 더 간결한 LINQ 문 :

var results = from p in PersonList
              group p by p.AreaID into g
              select new { AreaID=g.Key, Count=g.Count() };

foreach(var item in results)
    Console.WriteLine("There were {0} items in Area {1}", item.Count, item.AreaID);

ToLookup() 당신이 원하는 것을 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top