LINQ 집계(Aggregate) ν•¨μˆ˜: κ²Œμž„ 데이터 톡계

κ²Œμž„μ„ κ°œλ°œν•  λ•Œ, ν”Œλ ˆμ΄μ–΄μ˜ μŠ€νƒ―, λͺ¬μŠ€ν„°μ˜ λŠ₯λ ₯치, μ•„μ΄ν…œμ˜ κ°€μΉ˜ λ“± μˆ˜λ§Žμ€ λ°μ΄ν„°μ˜ 평균값, 합계, 개수 등을 계산해야 ν•  ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€. LINQ의 집계 ν•¨μˆ˜λŠ” μ΄λŸ¬ν•œ 톡계 계산을 맀우 κ°„κ²°ν•˜κ²Œ μ²˜λ¦¬ν•΄ μ€λ‹ˆλ‹€.

1. Average (평균 계산)

Average()λŠ” μ»¬λ ‰μ…˜ λ‚΄μ˜ 숫자 κ°’λ“€μ˜ μ‚°μˆ  평균을 계산할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

κ²Œμž„ 개발 μ‹œλ‚˜λ¦¬μ˜€:

  • νŒ€ 평균 μ „νˆ¬λ ₯ 계산: νŒ€μ˜ μ „λ°˜μ μΈ 강함을 νŒŒμ•…ν•©λ‹ˆλ‹€.
  • μ•„μ΄ν…œ 평균 가격: μ‹œμž₯μ΄λ‚˜ μƒμ μ—μ„œμ˜ 평균 거래 가격을 κ³„μ‚°ν•©λ‹ˆλ‹€.
  • ν”Œλ ˆμ΄ νƒ€μž„ 평균: μœ μ €λ“€μ˜ 평균 ν”Œλ ˆμ΄ μ‹œκ°„μ„ κ³„μ‚°ν•˜μ—¬ μ½˜ν…μΈ  μ†ŒλΉ„ 속도λ₯Ό νŒŒμ•…ν•©λ‹ˆλ‹€.

μ½”λ“œ μ˜ˆμ‹œ:

public class Unit
{
    public string Name { get; set; }
    public int AttackPower { get; set; }
}

List<Unit> partyMembers = new List<Unit>
{
    new Unit { Name = "Knight", AttackPower = 85 },
    new Unit { Name = "Archer", AttackPower = 60 },
    new Unit { Name = "Mage", AttackPower = 95 }
};

// νŒŒν‹°μ›λ“€μ˜ 평균 곡격λ ₯ 계산
double averageAttack = partyMembers.Average(unit => unit.AttackPower);

// κ²°κ³Ό: averageAttack = 80.0

2. Sum (합계 계산)

Sum()은 μ»¬λ ‰μ…˜ λ‚΄μ˜ 숫자 값듀을 **λͺ¨λ‘ λ”ν•œ κ°’(합계)**을 κ³„μ‚°ν•©λ‹ˆλ‹€.

κ²Œμž„ 개발 μ‹œλ‚˜λ¦¬μ˜€:

  • 인벀토리 총 κ°€μΉ˜: 인벀토리에 μžˆλŠ” λͺ¨λ“  μ•„μ΄ν…œμ˜ κ°€μΉ˜ 합계λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.
  • μžμ› μ΄λŸ‰: ν”Œλ ˆμ΄μ–΄κ°€ λ³΄μœ ν•œ λ‚˜λ¬΄, 철광석 λ“±μ˜ μžμ› μ΄λŸ‰μ„ κ³„μ‚°ν•©λ‹ˆλ‹€.
  • νŒŒν‹° 총 체λ ₯: νŒŒν‹°μ› μ „μ²΄μ˜ 남은 체λ ₯ 합계λ₯Ό κ³„μ‚°ν•˜μ—¬ μœ„κΈ° 상황을 νŒλ‹¨ν•©λ‹ˆλ‹€.

μ½”λ“œ μ˜ˆμ‹œ:

public class Resource
{
    public string Type { get; set; }
    public int Quantity { get; set; }
}

List<Resource> playerResources = new List<Resource>
{
    new Resource { Type = "Wood", Quantity = 150 },
    new Resource { Type = "Stone", Quantity = 90 },
    new Resource { Type = "Gold", Quantity = 35 }
};

// ν”Œλ ˆμ΄μ–΄κ°€ λ³΄μœ ν•œ μžμ›μ˜ 총 개수
int totalQuantity = playerResources.Sum(r => r.Quantity);

// κ²°κ³Ό: totalQuantity = 275 (150 + 90 + 35)

3. Count / LongCount (개수 μ„ΈκΈ°)

Count() λ˜λŠ” LongCount()λŠ” μ»¬λ ‰μ…˜ λ‚΄μ˜ μš”μ†Œ 개수λ₯Ό μ„Έκ±°λ‚˜, νŠΉμ • 쑰건을 λ§Œμ‘±ν•˜λŠ” μš”μ†Œμ˜ 개수λ₯Ό μ…€ λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

κ²Œμž„ 개발 μ‹œλ‚˜λ¦¬μ˜€:

  • ν™œμ„± μƒνƒœμ˜ 적: ν˜„μž¬ ν™”λ©΄μ΄λ‚˜ λ²”μœ„ 내에 μ‚΄μ•„μžˆλŠ” 적의 수λ₯Ό μ„Έμ–΄ λ‚œμ΄λ„λ₯Ό λ™μ μœΌλ‘œ μ‘°μ ˆν•©λ‹ˆλ‹€.
  • νŠΉμ • 버프λ₯Ό κ°€μ§„ μœ λ‹›: β€œκ³΅κ²©λ ₯ 증가” 버프λ₯Ό 받은 μœ λ‹›μ˜ 수λ₯Ό μ„Έμ–΄ 버프 효과λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.
  • λ―Έμ™„λ£Œ ν€˜μŠ€νŠΈ: ν”Œλ ˆμ΄μ–΄κ°€ μ§„ν–‰ 쀑인 ν€˜μŠ€νŠΈμ˜ 개수λ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€.

μ½”λ“œ μ˜ˆμ‹œ:

public class Quest
{
    public string Title { get; set; }
    public bool IsCompleted { get; set; }
}

List<Quest> questLog = GetCurrentQuests();

// 1. 전체 ν€˜μŠ€νŠΈ 개수
int totalQuests = questLog.Count();

// 2. λ―Έμ™„λ£Œ μƒνƒœμΈ ν€˜μŠ€νŠΈμ˜ 개수 (Where 필터링과 λ™μΌν•œ 효과)
int incompleteQuests = questLog.Count(q => q.IsCompleted == false);

// κ²°κ³Ό μ˜ˆμ‹œ: totalQuests = 8, incompleteQuests = 3

4. μ„±λŠ₯ μ΅œμ ν™” 팁: Count() vs. Any()

μ•žμ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄, κ²Œμž„ κ°œλ°œμ—μ„œλŠ” μ„±λŠ₯이 맀우 μ€‘μš”ν•©λ‹ˆλ‹€.

  • Count(): μ •ν™•ν•œ 개수λ₯Ό μ„Έμ•Ό ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. μ»¬λ ‰μ…˜ 전체λ₯Ό μˆœνšŒν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • Any(): β€œν•˜λ‚˜λΌλ„ μ‘΄μž¬ν•˜λŠ”μ§€β€ μ—¬λΆ€λ§Œ 확인할 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. 쑰건에 λ§žλŠ” 첫 번째 μš”μ†Œλ₯Ό μ°ΎλŠ” μ¦‰μ‹œ 검색을 λ©ˆμΆ”κΈ° λ•Œλ¬Έμ— Count()보닀 훨씬 λΉ λ¦…λ‹ˆλ‹€.

쑴재 μ—¬λΆ€λ§Œ ν•„μš”ν•˜λ‹€λ©΄, λ°˜λ“œμ‹œ Any()λ₯Ό μ‚¬μš©ν•˜μ„Έμš”.

// λΉ„νš¨μœ¨μ : Count()λ₯Ό 0κ³Ό 비ꡐ (전체 순회 ν›„ 개수 확인)
if (enemies.Count(e => e.IsBoss) > 0)
{
    // ...
}

// 효율적: Any() μ‚¬μš© (보슀λ₯Ό 찾으면 μ¦‰μ‹œ 쀑단)
if (enemies.Any(e => e.IsBoss))
{
    ShowBossWarningUI();
}

μ΄λŸ¬ν•œ LINQ 집계 ν•¨μˆ˜λ“€μ„ ν™œμš©ν•˜λ©΄, 데이터λ₯Ό 효과적으둜 λΆ„μ„ν•˜κ³  κ²Œμž„ λ‘œμ§μ„ 훨씬 κ°„κ²°ν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€!