2017-10-09 5 views
4

Okだから、いくつかのforループを含むstring/int配列を含むコードを作成しました。私のコードでは、1つ以上の文字列が含まれる部分がありますが、複数の文字列がある場合は、どのように文字列を複数形にしますか?ここで私が話しているコードの一部です:int配列とforループで使用すると、配列内の文字列を複数にする

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class VoidFunctions : MonoBehaviour 
{ 
    public string[] Enemies = {"Ghoul", "Skeleton", "Zombie"}; 
    public int[] enemyCount = {1, 2, 2}; 
    public virtual void Start() 
    { 
    for (int i = 0; i < Enemies.Length; i++) 
    { 
     Fight(Enemies[i], enemyCount[i]); 
    } 
    } 
    void Fight(string enemy, int amount) 
    { 
    print(this.name + " encountered a " + enemy); 
    print(this.name + " killed " + amount + " " + enemy);  
    } 
} 

だから、2番目の文字列「スケルトン」のために、そこに2殺害はあるが、それは出てくる、あなたがそれを作るのですか...「2スケルトンは、殺されました」複数?

+4

Pluralization Serviceを使用することができますhttps://msdn.microsoft.com/en-us/library/system.data.entity.design.pluralizationservices.pluralizationservice.aspx –

+1

「Enemy」クラスを作成することをお勧めします。独立した配列ですべての敵のプロパティを追跡する。 –

答えて

2

Ness Rosales氏によれば、複数化ソフトウェアや変換チャートを使用することができます。このタイプのプロジェクトでは、20項目以下の場合、このようなソフトウェアの過剰使用を検討します。私はどうなるのか

は、各名詞の単数および複数の両方の形式を持っている敵の配列を変更です:

public string[][2] Enemies = 
{ 
    {“Ghoul”, ”Ghouls”}, {“Skeleton”, “Skeletons”}, {“Zombie”, “Zombies”} 
}; 

ここから、文字列0または1を取得するためにif/else文を作ることができますそれぞれの名詞は量に依存する。

+1

このアプローチの問題は、単語ごとに両方のフォームを入力してからそのリストを検索する必要があることです。リストに要求された単語が含まれていないとどうなりますか? – Aybe

+0

@Aybe実行可能な唯一のオプションは、単数形の複数の変換の大規模なライブラリを使用するか、必要な変換(この場合は3)を行い、配列に格納することです。もちろん、我々は、ユーザが単数名詞を動的に追加せず、複数形式を出力することを期待している。 *その場合、はい、あなたは正しいので、この方法は動作しません。 – WebsitesOntario

+0

私はこれにとって超初心者です。 "プロジェクト"は実際にvoid関数XD の10個の例を持つ短いコードですが、もっと楽しくするためにもう少しでした。 if/elseそれはforループまたはvoid関数にあるでしょうか? –

2

それを達成するために、複数の方法があります。

  • 単に(依存西洋言語)最後にsを追加する簡単な方法
  • PluralizationServiceで堅牢な方法@Nessロサレスで指摘したように

コード:

using System; 
using System.Data.Entity.Design.PluralizationServices; 
using System.Globalization; 

namespace WindowsFormsApp1 
{ 
    internal class MyClass 
    { 
     private static void CheckParameters(string word, int count) 
     { 
      if (string.IsNullOrWhiteSpace(word)) 
       throw new ArgumentException("Value cannot be null or whitespace.", nameof(word)); 

      if (count <= 0) 
       throw new ArgumentOutOfRangeException(nameof(count)); 
     } 

     public static string GetLabel1(string word, int count) 
     { 
      CheckParameters(word, count); 

      var label = $"{word}{(count > 1 ? "s" : string.Empty)}"; 

      return label; 
     } 

     public static string GetLabel2(string word, int count) 
     { 
      CheckParameters(word, count); 

      // TODO this should be a member instead of being instantiated every time 
      var service = PluralizationService.CreateService(CultureInfo.CurrentCulture); 

      var label = count > 1 ? service.Pluralize(word) : service.Singularize(word); 

      return label; 
     } 
    } 
} 
関連する問題