相关疑难解决方法(0)

集合<T>与List <T>您应该在接口上使用什么?

代码如下所示:

namespace Test
{
    public interface IMyClass
    {
        List<IMyClass> GetList();
    }

    public class MyClass : IMyClass
    {
        public List<IMyClass> GetList()
        {
            return new List<IMyClass>();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行代码分析时,我得到以下建议.

警告3 CA1002:Microsoft.Design:更改'IMyClass.GetList()'中的'List'以使用Collection,ReadOnlyCollection或KeyedCollection

我应该如何解决这个问题以及这里有什么好的做法?

.net c# collections code-analysis

152
推荐指数
3
解决办法
8万
查看次数

为什么List <T>没有密封?

在阅读了这个问题的答案后,脑海中浮现出这个问题; 这基本上List<T>没有虚拟方法,因为它被设计为"快速,不可扩展".

如果这是设计目标,为什么原始设计不包括密封类?(我知道现在不可能,看看这会如何破坏客户端代码中的很多子类)

.net c# language-design sealed

23
推荐指数
1
解决办法
1146
查看次数

正确公开List <T>?

我知道我不应该暴露一个List<T>属性,但我想知道这样做的正确方法是什么?例如,这样做:

public static class Class1
{
    private readonly static List<string> _list;

    public static IEnumerable<string> List
    {
        get
        {
            return _list;
            //return _list.AsEnumerable<string>(); behaves the same
        }
    }

    static Class1()
    {
        _list = new List<string>();
        _list.Add("One");
        _list.Add("Two");
        _list.Add("Three");
    }
}
Run Code Online (Sandbox Code Playgroud)

允许我的来电者简单地回到List<T>:

    private void button1_Click(object sender, EventArgs e)
    {
        var test = Class1.List as List<string>;
        test.Add("Four"); // This really modifies Class1._list, which is bad™
    }
Run Code Online (Sandbox Code Playgroud)

所以,如果我想要一个真正不可变的List<T>,我总是要创建一个新的列表?例如,这似乎有效(测试在转换后为null):

    public static IEnumerable<string> List
    {
        get
        {
            return new ReadOnlyCollection<string>(_list); …
Run Code Online (Sandbox Code Playgroud)

.net c#

12
推荐指数
2
解决办法
2599
查看次数

如何使用LINQ避免冗余List

我有一个Report对象,它具有Recipients属性(String数据类型)."收件人"属性将保留所有收件人的电子邮件地址comma separated string.我需要从逗号分隔的字符串创建电子邮件对象的" 集合 ".我有以下代码使用字符串列表 来获取电子邮件地址.然后我创建了一个电子邮件对象的集合.

有没有更好的方法来避免冗余的List和Collection使用LINQ

  Report report = new Report();
  report.Recipients   = "test@test.com, demo@demo.com";

  List<string> emailAddressList = new List<string>( report.Recipients.Split(',') );
  Collection<Email> emailObjectCollection = new Collection<Email>();

  foreach (string emailAddress in emailAddressList)
  {
           Email email = new Email();
           email.EmailAddress = emailAddress;
           emailObjectCollection.Add(email);
  }
Run Code Online (Sandbox Code Playgroud)

参考文献:

  1. 避免使用一个字典的更好代码 - 案例敏感性问题
  2. 使用linq删除列表中的重复项
  3. 使用LINQ查找多个属性的重复项
  4. C#:List <T>和Collection <T>之间的区别(CA1002,不公开通用列表)

CA1002:不要公开通用列表.System.Collections.Generic.List是一个通用集合,专为性能而非继承而设计,因此不包含任何虚拟成员.http://msdn.microsoft.com/en-us/library/ms182142(v=vs.80).aspx

c# linq

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

4
推荐指数
1
解决办法
1328
查看次数

修复代码分析错误或违反Liskov替换原则/使代码效率低得多

我正在PriorityQueue<T>上课,现在我正在List<T>用作后备商店.以下是我得到的错误:

有正确的后缀/没有不正确的后缀

不要暴露 List<T>

对于-Queue后缀我需要继承Queue<T>,但是为了排序Queue<T>,我需要清空队列,排序,然后重新填充队列.此外,如果我继承Queue<T>,我会违反LSP,因为优先级队列不是FIFO集合.

对于其中一种PriorityQueues,我正在使用a IComparer<T>来比较元素,但IComparer<T>只支持在数组和List<T>.

我确实看到了这个问题,但它与我的问题没有完全相关.

所以这是我的问题:我应该抑制这些代码分析警告吗?我应该继承Queue<T>并重写我的类来解决它,即使效率较低吗?如果没有,我还应该换掉List<T>其他东西吗?

编辑:我不知道这是否会有所不同,但以下是我的每个类的设置:

  • PriorityQueue<T> - 抽象基类(Sort()是抽象的)

  • PriorityQueue<T, TComparer> - 使用比较器进行排序的子类

  • ReflectionPriorityQueue<T> - 使用反射进行排序的子类,对此问题不重要的细节.

c# code-analysis visual-studio-2010

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