在c#中更新逗号分隔的字符串列表

时间:2011-07-06 15:40:49

标签: c#

我有一个逗号分隔的字符串列表,如下所示:

Cat, Animal, 2
Dog, Animal, 3
Luke, Human, 1
Owl, Animal, 0

现在我要搜索列表,查找包含动物的所有字符串元素,并在其编号中添加一个。因此,在我的查询结束时,列表将如下所示:

Cat, Animal, 3
Dog, Animal, 4
Luke, Human, 1
Owl, Animal, 1

我如何实现此功能?我正在考虑使用LINQ查询来获取包含animal的所有条目,然后获取列表中每个元素的索引,通过使用逗号分割获取每个元素中的所有标记,将第三个标记解析为整数,递增通过一个并重写以前保存的索引中的元素来更新计数。这可能是效率最低的方法,所以任何人都可以建议一个快速,简短和甜蜜的解决方案吗?

由于

7 个答案:

答案 0 :(得分:6)

我建议创建一个表示列表行的类,而不是分割和搜索字符串,这是非常低效的,特别是如果您多次处理列表,例如

public class Creature
{
  public string Name { get; set; };
  public string Species  { get; set; };
  public int Count { get; set; };
}

可以更轻松地访问存储在列表中的这些内容。你的字符串的内容必须转换两次:如果你从一个文件中读取它们,则在程序开始时为1st;如果你想再次存储它们,则在结尾处为第二个。

您可以使用LINQ来搜索您搜索的结果:

listOfCreatures.Where(creature => creature.Species == "Animal").ToList();

答案 1 :(得分:0)

以下是一些示例代码,用于演示您所描述的内容:

    namespace ConsoleApplication1
    {
    class Program
    {
        static void Main(string[] args)
        {
            var content = new string[] { "Cat, Animal, 2", "Dog, Animal, 3", "Luke, Human, 1", "Owl, Animal, 0" };
            foreach (var item in content)
            {
                Console.WriteLine(IncrementIfKeywordFound(item, "Animal"));
            }
            Console.ReadLine();
        }

        private static string IncrementIfKeywordFound(string data, string keyword)
        {
            var parts = data.Split(new [] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
            if (parts[1] == keyword) parts[2] = (Convert.ToInt32(parts[2]) + 1).ToString();
            return string.Join(", ", parts);
        }
    }
}

答案 2 :(得分:0)

假设这是一个List或任何可以转换为

的东西
for(i = 0;i < yourList.Count; i++)
{
   String str = yourList[i];
   if(str.Contains("Animal")
   {
       var parts = string.Split(@',');
       parts[2] = Integer.Parse(parts[2]) + 1;
       str = String.Join(parts, ",");
   }
}

只读一次,只在需要更改时才写。

答案 3 :(得分:0)

使用正则表达式。只是为了踢,不要这样做,它不是很灵活也不可维护。

        static void Main(string[] args)
        {
            string source = @"Cat, Animal, 2
Dog, Animal, 3
Luke, Human, 1
Owl, Animal, 0";

            System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@", Animal, (\d+)");
            foreach (string line in source.Split(new string[] { Environment.NewLine },StringSplitOptions.RemoveEmptyEntries))
            {

                System.Text.RegularExpressions.MatchCollection collection = r.Matches(line);
                if (collection.Count == 1)
                {
                    int val = -1;
                    int.TryParse(collection[0].Groups[1].Value, out val);
                    Console.WriteLine(line.Replace(val.ToString(), (val + 1).ToString()));
                }
                else
                {
                    Console.WriteLine(line);
                }
            }
        }

答案 4 :(得分:0)

以下是Linq表达式的答案:

List<string> source = new List<string>();
source.Add("Cat, Animal, 2");
source.Add("Dog, Animal, 3");
source.Add("Luke, Human, 1");
source.Add("Owl, Animal, 0");

List<string> dest = new List<string>(
    source
        .Select(s => s.Split(new []{',', ' '}, StringSplitOptions.RemoveEmptyEntries))
        .Select(s => { if(s[1] == "Animal") s[2] = (Convert.ToInt32(s[2]) + 1).ToString(); return s; })
        .Select(s => String.Join(", ", s))
    );

答案 5 :(得分:0)

这是一个粗略的例子。将CSV加载到“表”中,然后修改它并写回文件。

public static List<string[]> LoadCSV() {
    List<string[]> table = new List<string[]>();

    // Replace the below with something like File.ReadAllLines(...);
    string[] lines = "Cat, Animal, 3\r\nDog, Animal, 4\r\nLuke, Human, 1\r\nOwl, Animal, 1"
        .Split(new string[] { "\r\n" }, StringSplitOptions.None);

    foreach (string line in lines) {
        table.Add(line.Split(new string[] { ", " }, StringSplitOptions.None));
    }

    return table;
}

static void Main(string[] args) {
    List<string[]> items = LoadCSV();

    foreach (string[] item in items) {
        if (item[2] == "Animal") {
            item[2] = (int.Parse(item[1]) + 1).ToString();
        }
    }

    // Write back to file
}

相反,您可以创建一个AnimalList类来存储类型类'Animal'的集合,该集合将定义属性Animal / Type / Value(或您想要调用它们的属性),并编写您自己的Add / Remove / Save /加载方法。

答案 6 :(得分:0)

我首先创建一个类来保存列表中的每个项目。

public class Creature
{
    public string Name { get; set; }
    public string Species { get; set; }
    public int Count { get; set; }

    public Creature(string name, string species, int count)
    {
        this.Name = name;
        this.Species = species;
        this.Count = count;
    }

    public void Add(int numToAdd)
    {
        this.Count += numToAdd;
    }
    }

public static class CreatureStorage
{
    private static bool isInitialized = false;

    private static List<Creature> creatureList = new List<Creature>();

    public static List<Creature> CreatureList
    {
        get {
                if (isInitialized == false)
                {
                    Initialize();
                }

                return creatureList; 
            }
        set { creatureList = value; }
    }

    public static void Add(string species, int numToAdd)
    {
        foreach (Creature creature in creatureList)
        {
            if (creature.Species.Equals(species))
            {
                creature.Add(numToAdd);
            }
        }
    }

    private static void Initialize()
    {
        // Add code to parse through your initial list whether it's a txt file or just a string in the application

        isInitialized = true;
    }

使用示例。

   public partial class ProcessAnimals : Form
    {
        public ProcessAnimals()
        {
            InitializeComponent();
        }

        private void processAnimals_Click(object sender, EventArgs e)
        {
            CreatureStorage.Add("Animal", 1);
        }
    }