用于更改列表中值的枚举选择方法

时间:2013-11-13 13:37:51

标签: c# linq list

(请投票需要解释)

简单的问题:我的Linq出了什么问题。我希望列表的值被其索引替换。我想的很简单:

var dd = myList.Select((x, i) => new {x=i});

dd为空。我不是Linq的专家,我正在学习它是如何工作的。

3 个答案:

答案 0 :(得分:1)

不要使用linq来修改集合。 Linq用于查询,它不是为修改集合而设计的。

LINQ => 语言集成查询

" Q"代表"查询"。

对于你的问题,我认为这没有道理。索引将是" 0 - count-1"

var dd = Enumerable.Range(0, myList.Count).ToList();

这应该这样做。

<小时/> 我想你的意思是这个?

var dd = myList.Select((x, i) => new { Value = x, Index = i}).ToList();

答案 1 :(得分:1)

Linq不应该用于修改集合。您可以使用Select创建包含索引的新列表。

var dd = myList.Select((x, i) => i).ToList();

关于你的评论

  

我想根据它的索引来操作x的值。

通常使用foreach循环来完成此操作,但可以使用Select

var dd = items.Select((x, i) => i % 42 == 0 ? 10 : x);

或更一般地

public static class EnumerableExtensions
{
    public static IEnumerable<T> Replace<T>(
        this IEnumerable<T> collection,
        Func<T, bool> predicate,
        T value
    )
    {
        return collection.Select((x, i) => predicate(x) ? value : x);
    }

    public static IEnumerable<T> Replace<T>(
        this IEnumerable<T> collection,
        Func<T, int, T> predicate,
        T value
    )
    {
        return collection.Select((x, i) => predicate(x, i) ? value : x);
    }
}

var dd = items.Replace((x, i) => i % 42 == 0, 10);

答案 2 :(得分:-1)

var dd = myList.Select(i => myList.IndexOf(i));

这应该可以解决问题