【发布时间】:2013-06-16 07:34:02
【问题描述】:
我创建了一个元组列表:
static List<Tuple<string, string>> Alt;
用户添加到此列表中:
Alt.Add(new Tuple<string, string>(tbAlt.Text, ""));
根据第一个字符串(即 tbAlt.Text )查找元组并删除它或修改第二个字符串的最佳方法是什么?
我是使用元组和列表的新手 :)
非常感谢您的帮助!
【问题讨论】:
我创建了一个元组列表:
static List<Tuple<string, string>> Alt;
用户添加到此列表中:
Alt.Add(new Tuple<string, string>(tbAlt.Text, ""));
根据第一个字符串(即 tbAlt.Text )查找元组并删除它或修改第二个字符串的最佳方法是什么?
我是使用元组和列表的新手 :)
非常感谢您的帮助!
【问题讨论】:
您可以使用List<T>.FindIndex 查找匹配的索引,然后根据需要进行替换。
int index = Alt.FindIndex(t => t.Item1 == tbAlt.Text);
if (index != -1)
{
// Modify
Alt[index] = Tuple.Create(tbAlt.Text, "NewText");
// Remove:
Alt.RemoveAt(index);
}
【讨论】:
根据第一个字符串 (Item1) 的值查找元组:
var t = Alt.FirstOrDefault(i => i.Item1 == "SomeString");
if(t != null)
{
// delete
Alt.Remove(t);
}
来自 cmets:
您不能修改第二项 (Item2) 的值,因为元组是不可变的,因此您必须将其删除并重新添加。
【讨论】:
Item2: msdn.microsoft.com/en-us/library/dd386892.aspx 这就是我使用 FindIndex 而不是 LINQ 的原因(所以你可以替换列表中的整个元组)
如果您确定列表中包含您的项目:
Alt.Remove(Alt.First(i => i.Item1 == tbAlt.Text));
但是,要修改元组,您必须创建一个新元组。
if (Alt.Any(i => i.Item1 == tbAlt.Text))
{
Alt.Remove(Alt.First(i => i.Item1 == tbAlt.Text));
Alt.Add(new Tuple<string, string>(tbAlt.Text, "Something New"));
}
【讨论】:
您的元组列表看起来很像字典。考虑改用它 - Dictionary<string,string> 。它已经具有按键检索值、删除值等方法
如果同一个键可能有多个值,则可以使用 Lookup 类。
【讨论】:
看来第一个字符串必须是唯一的,否则您将找不到(单数)
你为什么使用List<Tuple<string, string>>?
为什么不Dictionary<string,string>?
Dictionary<TKey, TValue>.ContainsKey 非常非常快。
【讨论】: