我是C#的新手并且处理IEnumerable。我想替换IEnumerable中的特定项。例如。
IEnumerable<string> m_oEnum = new string[] {"abc","def","ghi", "abcdef"};
我只想用“abc-test”替换字符串“abc”,但不要更改“abcdef”。
答案 0 :(得分:3)
m_oEnum = m_oEnum.Select(s => s == "abc" ? "abc-test" : s).ToArray();
答案 1 :(得分:0)
如果您的目的是更新数组中的特定值,并且您将知道要更新的项目的索引:
var itemIndex = 0
var m_oEnum = new string[] { "abc", "def", "ghi", "abcdef" };
m_oEnum[itemIndex] = "abc-test"
否则,另一个答案将达到同样的效果。请注意,源数组变量实际上不会改变那种方式。
答案 2 :(得分:0)
为什么不使用扩展方法?
请考虑以下代码:
var intArray = new int[] { 0, 1, 1, 2, 3, 4 };
// Replaces the first occurance and returns the index
var index = intArray.Replace(1, 0);
// {0, 0, 1, 2, 3, 4}; index=1
var stringList = new List<string> { "a", "a", "c", "d"};
stringList.ReplaceAll("a", "b");
// {"b", "b", "c", "d"};
var intEnum = intArray.Select(x => x);
intEnum = intEnum.Replace(0, 1);
// {0, 0, 1, 2, 3, 4} => {1, 1, 1, 2, 3, 4}
源代码:
namespace System.Collections.Generic
{
public static class Extensions
{
public static int Replace<T>(this IList<T> source, T oldValue, T newValue)
{
if (source == null)
throw new ArgumentNullException("source");
var index = source.IndexOf(oldValue);
if (index != -1)
source[index] = newValue;
return index;
}
public static void ReplaceAll<T>(this IList<T> source, T oldValue, T newValue)
{
if (source == null)
throw new ArgumentNullException("source");
int index = -1;
do
{
index = source.IndexOf(oldValue);
if (index != -1)
source[index] = newValue;
} while (index != -1);
}
public static IEnumerable<T> Replace<T>(this IEnumerable<T> source, T oldValue, T newValue)
{
if (source == null)
throw new ArgumentNullException("source");
return source.Select(x => EqualityComparer<T>.Default.Equals(x, oldValue) ? newValue : x);
}
}
}
添加了前两个方法来更改引用类型的对象。当然,您只能对所有类型使用第三种方法。
答案 3 :(得分:-1)
为了建立Tim Schmelter的答案,您将使用现有代码实现,如此通知您不需要将变量声明为IEnumerable<string>
var m_oEnum = new string[] { "abc", "def", "ghi", "abcdef" };
m_oEnum = m_oEnum.Select(s => s == "abc" ? "abc-test" : s).ToArray();
答案 4 :(得分:-3)
尝试类似
的内容m_oEnum.ToList()[0]="abc-test";