عن طريق قائمة <الشخص> متميزة () لإرجاع القيم 2
-
05-07-2019 - |
سؤال
ولدي فئة 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 ();
وبدلا من متميزة، استخدم GroupBy أ > أو بيان 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()
سوف تفعل ما تريد.