替换IEnumerable <string> </string>中的特定项

时间:2015-04-17 21:49:08

标签: c# search replace ienumerable

我是C#的新手并且处理IEnumerable。我想替换IEnumerable中的特定项。例如。

IEnumerable<string> m_oEnum = new string[] {"abc","def","ghi", "abcdef"};

我只想用“abc-test”替换字符串“abc”,但不要更改“abcdef”。

5 个答案:

答案 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}
  • 无代码重复
  • 无需输入长linq表达式
  • 无需额外使用

源代码:

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);
        }
    }
}

添加了前两个方法来更改引用类型的对象。当然,您只能对所有类型使用第三种方法。

另一个问题的答案相同:https://stackoverflow.com/posts/38728879/edit

答案 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();

enter image description here

答案 4 :(得分:-3)

尝试类似

的内容
m_oEnum.ToList()[0]="abc-test";