Lists的.Last()方法仅返回一个值。我希望能够做到这样的事情。
List<int> a = new List<int> { 1, 2, 3 };
a.Last() = 4;
这是我尝试编写扩展方法(它不编译)
public unsafe static T* mylast<T>(this List<T> a)
{
return &a[a.Count - 1];
}
我想做的是什么?
编辑:
这是我想要使用它的一个例子。
shapes.last.links.last.points.last = cursor; //what I want the code to look like
//how I had to write it.
shapes[shapes.Count - 1].links[shapes[shapes.Count - 1].links.Count - 1].points[shapes[shapes.Count - 1].links[shapes[shapes.Count - 1].links.Count - 1].points.Count-1] = cursor;
这就是做
的原因shapes[shapes.Count-1]
不是真正的解决方案。
答案 0 :(得分:7)
只需使用
a[a.Count-1] = 4;
或者写一个扩展方法
a.SetLast(4);
即使您可以创建一个虚假扩展属性,也不是一个好主意。如果解决方案涉及不安全的代码,则会增加一倍。
答案 1 :(得分:5)
C#中没有extension properties。但是这里有一个你可以使用的扩展方法:
public static class ListEx
{
public static void SetLast<T>(this IList<T> list, T value)
{
if (list == null)
throw new ArgumentNullException("list");
if(list.Count == 0)
throw new ArgumentException(
"Cannot set last item because the list is empty");
int lastIdx = list.Count - 1;
list[lastIdx] = value;
}
//and by symmetry
public static T GetLast<T>(this IList<T> list)
{
if (list == null)
throw new ArgumentNullException("list");
if (list.Count == 0)
throw new ArgumentException(
"Cannot get last item because the list is empty");
int lastIdx = list.Count - 1;
return list[lastIdx];
}
}
以下是如何使用它
class Program
{
static void Main(string[] args)
{
List<int> a = new List<int> { 1, 2, 3 };
a.SetLast(4);
int last = a.GetLast(); //int last is now 4
Console.WriteLine(a[2]); //prints 4
}
}
如果您愿意,可以调整验证行为。
答案 2 :(得分:2)
您可以创建一个设置最后一个元素的扩展方法。
为简单起见,这是没有错误检查的情况:
public static class ListExtensions
{
public static void SetLast<T>(this IList<T> source, T value)
{
source[source.Count - 1] = value;
}
}
当然,如果你想正确地做,你也需要错误检查:
public static void SetLast<T>(this IList<T> source, T value)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
if (source.Count == 0)
{
throw new ArgumentException("cannot be empty", "source");
}
source[source.Count - 1] = value;
}
答案 3 :(得分:1)
我推荐Thom Smith的解决方案,但是如果你真的想拥有类似属性的访问权限,为什么不使用属性?
public class MyList<T> : List<T>
{
public T Last
{
get
{
return this[this.Count - 1];
}
set
{
this[this.Count - 1] = value;
}
}
}
用过:
var m = new MyList<int> { 1, 2, 3 };
m.Last = 4;
Console.WriteLine(m.Last);
没有不安全的代码,所以它更好。此外,它不排除使用LINQ的Last
方法(由于它们的使用方式,编译器可以将两者区分开来。)
答案 4 :(得分:0)
public class AdvancedList : List<int>
{
public int Last
{
get { return this[Count - 1]; }
set
{
if(Count >= 1 )
this[Count - 1] = value;
else
Add(value);
}
}
}
AdvancedList advancedList = new AdvancedList();
advancedList.Add(100);
advancedList.Add(200);
advancedList.Last = 10;
advancedList.Last = 11;
答案 5 :(得分:-2)
你可能会说:如果你想设置最后一个值:更酷的是传递一个新值:
public static void SetLast(this List<int> ints, int newVal)
{
int lastIndex = ints.Count-1;
ints[lastIndex] = newVal;
}