小编Mar*_*zek的帖子

如何从声明为IEnumerable <T>的方法/属性中安全地返回List <T>?

假设我有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个解决方案,但不是它们是完美的:

  1. foreach并且yield return:

    public IEnumerable<int> Bar
    {
        get
        {
            foreach (var item in _bar)
                yield return item;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    -写作和阅读真的很烦人.

  2. AsReadOnly():

    public IEnumerable<int> Bar
    {
        get { return _bar.AsReadOnly(); }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    +当有人试图修改返回的集合时+ …

c# ienumerable list

7
推荐指数
1
解决办法
801
查看次数

查找1 000 000数组中的整数和

给定一个大整数列表(超过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)

c# sum

7
推荐指数
2
解决办法
735
查看次数

Lambda表达式:包含列表的Where子句

所以我有这样的事情:

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条件放入包含的任务列表中?

c# linq lambda

6
推荐指数
2
解决办法
3万
查看次数

C#无法访问类的基本属性(仅继承)

这是我的代码(应该很容易理解我想要实现的目标):

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)

这是为什么?我以为我创造了一个鸡尾酒课,而不仅仅是一杯饮品?我究竟做错了什么?

谢谢!

c# oop inheritance properties visual-studio-2012

6
推荐指数
1
解决办法
7687
查看次数

List <T> .Enumerator IEnumerator.Reset()方法实现

尽管事实上,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)

这是很清楚的,它应打印True3的两倍.而不是结果

True
3
False
0
Run Code Online (Sandbox Code Playgroud)

我错过了任何简单的解释?

c# ienumerator list

6
推荐指数
1
解决办法
1842
查看次数

使用Roslyn获取项目中引用的类型列表

我想获得项目中所有使用类型的列表,例如:

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)

c# roslyn

6
推荐指数
1
解决办法
742
查看次数

C#6 null传播当object为null时设置的值

var result = myObject?.GetType();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果myObject为null ,那么Result的值是多少?

c# c#-6.0 null-propagation-operator

6
推荐指数
2
解决办法
218
查看次数

为什么IEnumerable.ToList会生成新对象

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问题坚持只有复制参考.

c# linq

5
推荐指数
2
解决办法
725
查看次数

如何将标准的Noda Timezone Id从英语转换为本地化语言?

我目前正在尝试将我的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)

c# nodatime

5
推荐指数
1
解决办法
842
查看次数

如何在ml.net中为tf-idf词袋获得带权重的词汇?

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# tf-idf ml.net

5
推荐指数
0
解决办法
601
查看次数