假设我有IEnumerable<int>使用List<int>字段支持的属性,所以我可以在类中修改集合,但它是以只读方式公开公开的.
public class Foo
{
private List<int> _bar = new List<int>();
public IEnumerable<int> Bar
{
get { return _bar; }
}
}
Run Code Online (Sandbox Code Playgroud)
但是使用这样的代码,您可以轻松地将从属性中检索到的对象转换回List<int>并修改它:
var foo = new Foo();
var bar = (List<int>)foo.Bar;
bar.Add(10);
Run Code Online (Sandbox Code Playgroud)
问题是:什么是最好的(最好的可读性,最容易编写,没有性能损失)避免这种情况的方法?
我可以提出至少4个解决方案,但不是它们是完美的:
foreach并且yield return:
public IEnumerable<int> Bar
{
get
{
foreach (var item in _bar)
yield return item;
}
}
Run Code Online (Sandbox Code Playgroud)
-写作和阅读真的很烦人.
AsReadOnly():
public IEnumerable<int> Bar
{
get { return _bar.AsReadOnly(); }
}
Run Code Online (Sandbox Code Playgroud)
+当有人试图修改返回的集合时+ …
给定一个大整数列表(超过1 000 000个值),找到选择其中两个加起来为0的方法有多少....是问题
我所做的是创建一个正的随机整数列表:
Random pos = new Random();
int POSNO = pos.Next(1, 1000000);
lstPOS.Items.Add(POSNO);
lblPLus.Text = lstPOS.Items.Count.ToString();
POSCount++;
Run Code Online (Sandbox Code Playgroud)
并创建了一个否定列表:
Random neg = new Random();
int NEGNO = neg.Next(100000, 1000000);
lstNEG.Items.Add("-" + NEGNO);
lblNegative.Text = lstNEG.Items.Count.ToString();
NegCount++;
Run Code Online (Sandbox Code Playgroud)
做我正在使用的总和检查:
foreach (var item in lstPOS.Items)
{
int POSItem = Convert.ToInt32(item.ToString());
foreach (var negItem in lstNEG.Items)
{
int NEGItem = Convert.ToInt32(negItem.ToString());
int Total = POSItem - NEGItem;
if (Total == 0)
{
lstADD.Items.Add(POSItem + "-" + NEGItem + "=" + Total);
lblAddition.Text = …Run Code Online (Sandbox Code Playgroud) 所以我有这样的事情:
var myObj = db.SomeObject
.Include("Tasks")
.SingleOrDefault(x => x.Id == someObjectId);
if (myObj != null)
{
myObj.Tasks = myObj.Tasks.OrderBy(x => x.Number).ToList();
}
Run Code Online (Sandbox Code Playgroud)
在这里,我希望能够where在我的Include上添加一个condition(),例如:
.where task.IsDeleted == false
因此我没有找到解决方案.
我知道我可以where和我在哪里订购任务一起使用,但是这不会在数据库上运行,而是使用内存.我希望它在数据库上运行.
这里有谁知道我怎么做到这一点?如果是这样,是否还有办法将order by条件放入包含的任务列表中?
这是我的代码(应该很容易理解我想要实现的目标):
public class Order
{
private Drink drink;
public Drink Drink {get { return drink; } set { drink = value; }}
}
public class Drink
{
enum colour
{
Red, Transparent
};
}
public class cocktail : Drink
{
private int alcoholContent;
public int AlcoholContent { get { return alcoholContent; } set { alcoholContent = value; } }
}
Run Code Online (Sandbox Code Playgroud)
然后我试图访问属性,但他们不在那里:
Order order = new Order();
order.Drink = new cocktail();
order.Drink. <- no alcohol content?
Run Code Online (Sandbox Code Playgroud)
这是为什么?我以为我创造了一个鸡尾酒课,而不仅仅是一杯饮品?我究竟做错了什么?
谢谢!
尽管事实上,IEnumerator.Reset永远不应该使用该方法,但我发现了方法实现的奇怪行为List<T>.
无论您如何检查.NET Framework源代码(尝试使用参考源和ILSpy),该方法都实现如下:
void System.Collections.IEnumerator.Reset() {
if (version != list._version) {
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
}
index = 0;
current = default(T);
}
Run Code Online (Sandbox Code Playgroud)
但是,看起来这个方法根本就没有被调用过!考虑一下代码:
var list = new List<int>(1) { 3 };
using (var e = list.GetEnumerator())
{
Console.WriteLine(e.MoveNext());
Console.WriteLine(e.Current);
((IEnumerator)e).Reset();
Console.WriteLine(e.MoveNext());
Console.WriteLine(e.Current);
}
Run Code Online (Sandbox Code Playgroud)
这是很清楚的,它应打印True和3的两倍.而不是结果
True
3
False
0
Run Code Online (Sandbox Code Playgroud)
我错过了任何简单的解释?
我想获得项目中所有使用类型的列表,例如:
var x = 1;
var y = x.ToString().GetType();
Run Code Online (Sandbox Code Playgroud)
该代码应返回System.Int32,System.String,System.Type.
我所拥有的是慢慢...对于每个文件(语法树),我执行以下操作:
var root = await syntaxTree.GetRootAsync();
var nodes = root.DescendantNodes(n => true);
if (nodes != null)
{
var syntaxNodes = nodes as SyntaxNode[] ?? nodes.ToArray();
// IdentifierNameSyntax:
// - var keyword
// - identifiers of any kind (including type names)
var namedTypes = syntaxNodes
.OfType<IdentifierNameSyntax>()
.Select(id => this.compilation
.GetSemanticModel(id.SyntaxTree)
.GetSymbolInfo(id)
.Symbol)
.OfType<INamedTypeSymbol>()
.ToArray();
// add the found types to the list
this.AddRange(namedTypes);
// ExpressionSyntax: …Run Code Online (Sandbox Code Playgroud) var result = myObject?.GetType();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果myObject为null ,那么Result的值是多少?
public class TestClass
{
public int Num { get; set; }
public string Name { get; set; }
}
IEnumerable<TestClass> originalEnumerable
= Enumerable.Range(1, 1).
Select(x => new TestClass() { Num = x, Name = x.ToString() });
List<TestClass> listFromEnumerable = originalEnumerable.ToList();
// false
bool test = ReferenceEquals(listFromEnumerable[0], originalEnumerable.ElementAt(0));
Run Code Online (Sandbox Code Playgroud)
如果我修改复制的对象,原始文件不会更改.
我从中理解,System.Linq.IEnumerable<T>即使在调用ToList()/ 时它们是引用类型,集合也总是会生成新对象ToArray().我错过了一些东西,因为其他SO问题坚持只有复制参考.
我目前正在尝试将我的windowsphone Time App本地化为几个国家.我正在使用Noda Time,因为这对新手来说非常容易.我面临的问题是所有Timezone Id都是标准英语,我正在寻找一种方法来将这些Id转换为本地语言字符串.
一种方法是为每种语言中的每个ID制作本地化字符串.但由于有500个时区,它似乎非常低效.请建议一种让我直接将TimeZone ID转换为本地语言的方法.
我的代码:
var now = Instant.FromDateTimeUtc(DateTime.UtcNow);
var tzdb = DateTimeZoneProviders.Tzdb;
var list = from id in tzdb.Ids
where id.Contains("/") && !id.StartsWith("etc", StringComparison.OrdinalIgnoreCase)
let tz = tzdb[id]
let offset = tz.GetUtcOffset(now)
orderby offset, id
select new
{
DisplayValue = string.Format("(UTC{0}) {1} {2} ", offset.ToString("+HH:mm", null), now.WithOffset(offset).TimeOfDay.ToString("hh:mm tt",null),id)
};
Run Code Online (Sandbox Code Playgroud) ML.NET 的文档展示了如何使用context.Transforms.Text.ProduceWordBags获取词袋。该方法将Transforms.Text.NgramExtractingEstimator.WeightingCriteria作为参数之一,因此可以请求使用TfIdf权重。最简单的例子是:
// Get a small dataset as an IEnumerable and then read it as a ML.NET data set.
IEnumerable<SamplesUtils.DatasetUtils.SampleTopicsData> data = SamplesUtils.DatasetUtils.GetTopicsData();
var trainData = ml.Data.LoadFromEnumerable(data);
var pipeline = ml.Transforms.Text.ProduceWordBags("bags", review, ngramLength: 1, weighting: Transforms.Text.NgramExtractingEstimator.WeightingCriteria.TfIdf);
var transformer = pipeline.Fit(trainData);
var transformed_data = transformer.Transform(trainData);
Run Code Online (Sandbox Code Playgroud)
一切都很好,但我如何得到实际结果transformed_data呢?
我在调试器中做了一些挖掘,但我仍然对这里实际发生的事情感到困惑。
首先,运行管道会添加三个额外的列transformed_data:
预览数据后,我可以看到这些列中的内容。为了让事情更清楚,这里是GetTopicsData返回的内容,这就是我们运行转换的内容:
animals birds cats dogs fish horse
horse birds house fish duck cats
car truck driver bus pickup
car truck driver …Run Code Online (Sandbox Code Playgroud) c# ×10
linq ×2
list ×2
c#-6.0 ×1
ienumerable ×1
ienumerator ×1
inheritance ×1
lambda ×1
ml.net ×1
nodatime ×1
oop ×1
properties ×1
roslyn ×1
sum ×1
tf-idf ×1