سؤال

ولدي فئة Person، مع Name وAreaID خصائص.

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

   // snip
}

ولدي List<Person> مع إمكانية مئات الأشياء شخص في القائمة. على سبيل المثال، 100 شخص مع AreaID = 1 و 100 شخص مع AreaID = 2

وأريد أن أعود قائمة متميزة من لAreaID وعدد الأشخاص يكون هذا AreaID.

وعلى سبيل المثال، AreaID = 1 = 100 أشخاص AreaID = 2 أشخاص = 100

هل كانت مفيدة؟

المحلول

ويبدو أنك تريد أن مجموعة من ID منطقة ثم:

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

وأنا باستخدام "مجموعة 1" للإشارة إلى أنني حقا لا يهتمون البيانات داخل كل مجموعة - فقط العد ومفتاح

وهذا غير فعالة في أن لديها للتخفيف عن النتائج من أجل التجمع - إجراء جيدا تكون قادرة على استخدام LINQ رد الفعل في NET 4.0 للقيام بذلك بشكل أكثر كفاءة، أو أنت بالتأكيد يمكن استخدام <لأ href = " http://msmvps.com/blogs/jon_skeet/archive/2008/01/04/quot-push-quot-linq-revisited-next-attempt-at-an-explanation.aspx "يختلط =" نوفولو noreferrer "> دفع 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 ();

وToLookup() سوف تفعل ما تريد.

scroll top