我有以下代码:
string acctStatus = account.AccountStatus.ToString();
if (!SettableStatuses().Any(status => status == acctStatus))
acctStatus = ACCOUNTSTATUS.Pending.ToString();
Run Code Online (Sandbox Code Playgroud)
请注意,account.AccountStatus是ACCOUNTSTATUS类型的枚举.在第二行,ReSharper向我发出了acctStatus的"访问修改后的关闭"的警告.当我执行建议的操作,复制到本地变量时,它将代码修改为以下内容:
string acctStatus = realAccount.AccountStatus.ToString();
string s = acctStatus;
if (!SettableStatuses().Any(status => status == s))
acctStatus = ACCOUNTSTATUS.Pending.ToString();
Run Code Online (Sandbox Code Playgroud)
为什么这比我原来的更好或更好?
编辑
它还建议在数组中包装局部变量,它产生:
string[] acctStatus = {realAccount.AccountStatus.ToString()};
if (!SettableStatuses().Any(status => status == acctStatus[0]))
acctStatus[0] = ACCOUNTSTATUS.Pending.ToString();
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很奇怪.
使用LINQ更新集合中特定项的单个属性的最简单/最简单的方法是什么?
例如,如果我有以下列表:
public class Ticket
{
public string Name { get; set; }
public string Code { get; set; }
public bool Selected { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如何使用LINQ更新Ticket项的"Selected"属性,因为其"Name"属性的值为"Beach".在SQL中它将是:
UPDATE Tickets SET Selected = true WHERE Name = 'Beach'
Run Code Online (Sandbox Code Playgroud)
我以为我跟这个......
tickets.Select(x => { x.Selected = true; return x; }).ToList().Where(x => x.Name == "Beach");
Run Code Online (Sandbox Code Playgroud) 我遇到了一些规则(建议)使用混凝土List和Dictionary,而不是IList和IDictionary给予,显示通过该接口访问样本测试是相当慢一点.例如,将10000个值添加到列表然后Count在列表上执行10亿次表示通过接口执行此操作比通过具体类执行它慢28倍.即,通过具体类需要80ms,通过界面需要2800ms,这表明它通过界面的速度非常慢.鉴于此,使用具体类是合理的.有没有理由说接口这么慢?(可能更多的是针对那些了解更多关于.net内部的人).
用于ienumerable的linq扩展方法非常方便......但是如果你想要做的就是对枚举中的每个项应用一些计算而不返回任何内容,那就没有用了.所以我想知道我是否只是错过了正确的方法,或者它是否真的不存在,因为我宁愿使用内置版本,如果它可用......但我还没找到一个:-)
我可以发誓在某处有一个.ForEach方法,但我还没有找到它.与此同时,我确实编写了自己的版本,以防它对其他人有用:
using System.Collections;
using System.Collections.Generic;
public delegate void Function<T>(T item);
public delegate void Function(object item);
public static class EnumerableExtensions
{
public static void For(this IEnumerable enumerable, Function func)
{
foreach (object item in enumerable)
{
func(item);
}
}
public static void For<T>(this IEnumerable<T> enumerable, Function<T> func)
{
foreach (T item in enumerable)
{
func(item);
}
}
}
Run Code Online (Sandbox Code Playgroud)
用法是:
myEnumerable.For<MyClass>(delegate(MyClass item) { item.Count++; });
我想知道是否有一个IEnumerable的方法,如.Net库中的以下.Each()
var intArray = new [] {1, 2, 3, 4};
intArrary.Each(Console.WriteLine);
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用foreach循环或轻松编写这样的扩展方法:
public static class EnumerableExtensions
{
public static void Each<T>(this IEnumerable<T> enumberable, Action<T> action)
{
foreach (var item in enumberable)
{
action(item);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果库中已经有这样的扩展方法,我希望不要创建自己的方法来搞乱代码.类似.Each()(带有一些可能需要条件作为额外参数的重载)的程序员非常需要它,而且应该已经有了一个.我对么?
更新
Ruby开发人员可能会将其识别为.each()迭代器.这就是我希望在C#中拥有的东西.也许C#可以拥有更多像Ruby那样的迭代器方法.
这是一个非常方便的扩展,适用于array任何事情:
public static T AnyOne<T>(this T[] ra) where T:class
{
int k = ra.Length;
int r = Random.Range(0,k);
return ra[r];
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,它不适合List<>任何事情.这是适用于任何人的相同扩展名List<>
public static T AnyOne<T>(this List<T> listy) where T:class
{
int k = listy.Count;
int r = Random.Range(0,k);
return listy[r];
}
Run Code Online (Sandbox Code Playgroud)
事实上,是否有一种方法可以一次性推广覆盖arrays和List<>s的泛型?或者知道不可能吗?
它发生在我身上,答案是否可以进一步包含Collections?或者确实有下面的专家之一已经实现了??
PS,我很抱歉没有明确提到这是在Unity3D环境中."Random.Range"是一个统一到骨骼的功能,"AnyOne"调用读取为任何游戏工程师的100%游戏引擎.这是你为任何游戏项目输入的第一个扩展,并且你经常在游戏代码中使用它("任何爆炸!""任何硬币声音效果!"等等!)
显然,它当然可以在任何c#milieu中使用.
在我的WPF应用程序中,我想尽可能多地使用LINQ(尤其要避免foreach).但是WPF与ObservableCollection一起工作很多,我不能将LINQ与这些集合一起使用.我能做什么?
有没有更好的方法来使用LINQ进行这些分配?
IEnumerable<SideBarUnit> sulist1 = newlist.Where(c => c.StatusID == EmergencyCV.ID);
foreach (SideBarUnit su in sulist1) su.color = "Red";
Run Code Online (Sandbox Code Playgroud) 不是总增量,而是每个元素的增量.这里有一些代码来解释我的意思:
var deltaTotals = _deltaEnumerable.Select(a => a.Amount).ToList();
var oldTotals = _totalsEnumerable.Select(d => d.Amount).ToList();
// trigger change in _totalsEnumerable
// ** can LINQ do the lines below
var newTotals = totalsEnumerable.Select(d => d.Amount);
for (var i = 0; i < 7; i++) {
var newAmount = oldTotals[i] - deltaTotals[i];
Assert.That(newTotals.ElementAt(i), Is.EqualTo(newAmount));
}
Run Code Online (Sandbox Code Playgroud)
这是最后四行代码,似乎在某种程度上可能有更优雅的方式在LINQ中做.
干杯,
Berryl
我实现了一个ExtensionMethod,它基本上用作ForEach-Loop,我的实现看起来像这样:
public static void ForEach(this ListItemCollection collection, Action<ListItem> act )
{
foreach (ListItem item in collection)
act(item);
}
Run Code Online (Sandbox Code Playgroud)
但是,我想在第一次满足特定条件后停止循环的方法.
这是我目前使用它的方式:
ddlProcesses.Items.ForEach(item => item.Selected = item.Value == Request["Process"]?true:false);
Run Code Online (Sandbox Code Playgroud)
问题是DropDownList中只能有一个项目符合这个要求,但是循环正在完成,解决这个问题最难的方法是什么?
谢谢.