小编Geo*_*rge的帖子

在.NET中本地存储数据的最佳方式(C#)

我正在编写一个应用程序,它接收用户数据并将其存储在本地以供日后使用.应用程序将经常启动和停止,我想在应用程序启动/结束时保存/加载数据.

如果我使用平面文件,那将是相当简单的,因为数据并不真正需要保护(它只会存储在这台PC上).我相信的选择因此是:

  • 平面文件
  • XML
  • SQL DB

平面文件需要更多的维护工作(没有类似于XML的内置类),但是之前我没有使用过XML,而且对于这个相对简单的任务来说,SQL似乎有些过分.

还有其他值得探索的途径吗?如果没有,哪一个是最好的解决方案?


编辑:要为问题添加更多数据,基本上我唯一想存储的是一个看起来像这样的字典

Dictionary<string, List<Account>> 
Run Code Online (Sandbox Code Playgroud)

其中Account是另一种自定义类型.

我会将dict序列化为xmlroot,然后将Account类型作为属性吗?


更新2:

所以可以序列化字典.使它变得复杂的是这个dict的值是泛型本身,它是Account类型的复杂数据结构的列表.每个帐户都相当简单,它只是一堆属性.

我的理解是,这里的目标是尝试最终得到:

<Username1>
    <Account1>
        <Data1>data1</Data1>
        <Data2>data2</Data2>
    </Account1>
</Username1>
<Username2>
    <Account1>
        <Data1>data1</Data1>
        <Data2>data2</Data2>
    </Account1>
    <Account2>
        <Data1>data1</Data1>
        <Data2>data2</Data2>
    </Account2>
 </Username2>
Run Code Online (Sandbox Code Playgroud)

你可以看到heirachy是

  • 用户名(字典串)>
  • 帐户(列表中的每个帐户)>
  • 帐户数据(即类属性).

从a获取这个布局Dictionary<Username, List<Account>>是棘手的一点,也是这个问题的本质.

这里有很多关于序列化的"如何"回应,这是我的错,因为我没有在早期更清楚,但现在我正在寻找一个明确的解决方案.

.net c# xml data-storage

68
推荐指数
9
解决办法
14万
查看次数

为什么我的WPF XAML Grid TranslateTransform.X?

我可以使用这个来改变网格的宽度/高度,所以当我使用(Grid.RenderTransform).TranslateTransform.X时,为什么它不会起作用:

<Window.Triggers>
 <EventTrigger RoutedEvent="Button.Click" SourceName="button">
  <BeginStoryboard>
    <Storyboard>
      <DoubleAnimation  
      Storyboard.TargetProperty="(Grid.RenderTransform).(TranslateTransform.X)" 
      From="0" To="200" Storyboard.TargetName="grid" Duration="0:0:2"
      />
    </Storyboard>
  </BeginStoryboard>
 </EventTrigger>
</Window.Triggers>
Run Code Online (Sandbox Code Playgroud)

应用程序加载等,但单击按钮时没有任何反应.

这是我网格的XAML:

    <Grid x:Name="grid" Height="714" Canvas.Left="240" Canvas.Top="8" Width="360" RenderTransformOrigin="0.5,0.5">
         <Grid.Background>
          <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
           <GradientStop Color="Black" Offset="0"/>
           <GradientStop Color="White" Offset="1"/>
          </LinearGradientBrush>
         </Grid.Background>
         <Grid.ColumnDefinitions>
          <ColumnDefinition Width="0*"/>
          <ColumnDefinition/>
         </Grid.ColumnDefinitions>
     </Grid>
Run Code Online (Sandbox Code Playgroud)

请注意,我尝试了许多不同的Canvas.Left值,但无济于事.

.net wpf xaml

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

是否可以从谷歌电子表格填充谷歌表单?

我想创建一个使用电子表格中的数据的表单,以便它是动态的。是否有可能做到这一点?我一直无法找到任何描述方法或任何示例的地方。

似乎所有可能的是从表单填充电子表格,我也会使用它,但它不是这里的主要关注点。

google-docs google-sheets google-apps-script google-forms

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

是否有更简单的方法将一组变量作为数组传递

我要做的是为我的StreamWriter实例编写一个专用方法,而不是在程序中的随机点上使用它.这会对调用类的位置进行本地化,因为当前的方法存在一些错误.

这就是我现在所拥有的:

public static void Write(string[] stringsToWrite) {

    writer = new StreamWriter(stream);

    writer.Write("hello");

    foreach (string stringToWrite in stringsToWrite) {
        writer.Write(" " + stringToWrite + " ");
    }

    writer.Flush();
}
Run Code Online (Sandbox Code Playgroud)

注意:stream是TcpClient的一个实例

有了这个我能够传递一个变量数组来写,但我不能使用与现有方法相同的方法调用:

writer.WriteLine("hello {0} {1} {2}", variable1, variable2, variable 3);
writer.Flush();
Run Code Online (Sandbox Code Playgroud)

如果我能够将x个变量传递给方法并且循环以这种方式编写每个变量,那将是很好的,但.NET中的可选参数直到v4.0仍然处于测试阶段才会到达.

有任何想法吗?

.net c# parameters arguments

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

为什么在构造函数中使用属性时会出现堆栈溢出?

我有一个非静态类,其中我有几个属性,即serverURL,serverPort等,并且该类有一个构造函数.构造函数接受参数,然后用它来"设置"属性,初始化它们.这是代码:

public Server(string newServerAddress, int newServerPort) {

        serverAddress = newServerAddress;
        serverPort = newServerPort;
}

public string serverAddress {
    get {
        return serverAddress;
    }
    set {
        serverAddress = value;
    }
}
public int serverPort {
    get {
        return serverPort;
    }
    set {
        serverPort = value;
    }
Run Code Online (Sandbox Code Playgroud)

由于某种原因,这给了我一个堆栈溢出错误,我不知道为什么.以下是用于调用它的代码:

Server test = new Server("server.url.here",8080);
Run Code Online (Sandbox Code Playgroud)

这段代码显然是由一个类绑定的,但我把它留在了这里.这是一个业余的问题,我以前做过这样的事情,但我对发生的事情感到很困惑,当我在visual studio中尝试调试它时,它告诉我它无法调试它,大概是因为它正在使用堆栈进行调试.

c# constructor properties

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

如何在SQL Server中使用随机聚合函数执行分组?

我有以下SQL:

select Username, 
    COUNT(DISTINCT Message) as "Count", 
    AVG(WordCount) as "Average",
    RAND(Message) //Essentially what I want to do 
from Messages
group by Username
order by "Count" desc
Run Code Online (Sandbox Code Playgroud)

我的两个聚合函数列为Count和Average,这很明显.我想要做的是从"消息"列中返回每个分组的随机行.

我在Linq2SQL中编写了这个查询,但它不支持随机数.

我想我需要创建一个自定义聚合函数,但它们看起来非常过分,我想知道在尝试之前是否有更简单的方法.我尝试了一个CLR聚合函数,但由于它们的dll性质,数据库在实例之间不会那么容易移植.

我也知道在SQL中使用每行随机数也有点冗长,但我找不到通过查询在我的组中使用它们的方法.

我已经看到了Marc Gravell关于随机行的想法: 从Linq到Sql的随机行,但是他的解决方案拉入了我不想做的每一行; 只有分组(数量级更小)

sql sql-server linq-to-sql

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

如何使用Resharper SDK从IClrDeclaredElement获取IDeclaredType

我正在为Resharper编写一个导航插件,我的情况是我有一个IDeclaredElement我从中获得的列表

var declaredElements = context.GetData(DataConstants.DECLARED_ELEMENTS)
Run Code Online (Sandbox Code Playgroud)

此元素是用户将鼠标光标放在其上的元素.

我想做的是获取IDeclaredType声明的元素,包括它可能具有的任何类型参数,如果它是泛型类型的话.

当涉及到类型系统时,resharper SDK文档很轻松,并没有真正解释各种类型之间的关系.

我已经在其他插件周围寻找试图找到这个的例子,但是空洞了.我已经检查了每个Util和Extension类,看看是否有某个方法可以提供我想要的东西,但是没有.

关于我发现的唯一的事情是:

declaredElements.First().GetSuperTypes()
Run Code Online (Sandbox Code Playgroud)

返回类型层次结构,不包括当前类型.有用,但不是我想要的.

有没有人有这个API的经验或了解它是如何工作的?我喜欢一个解释类型之间关系的答案.

我对它的理解,简而言之:

  • 名称中带有Declared的类型(IDeclaredElement, IDeclaredType) 似乎是指物理代码元素.
  • IType似乎是所有类型的顶级接口,与物理代码元素不对应
  • 我不清楚名称中带有Element的类型的含义(ITypeElement, IDeclaredElement),也许它指的是AST元素.

我很喜欢这方面的一些澄清.

c# resharper-sdk

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

如何使params关键字使用类似于写入控制台

关于我的上一个问题(是否有一种更简单的方法将一组变量作为数组传递)

我试图将字符串变量传递给写入流的方法,而不是在每个单独的方法中进行写入.

使用params关键字显然是一种解决方案,但是通过使用它我相信我不能做这样的事情:

Write("hello {0}",var1);
Run Code Online (Sandbox Code Playgroud)

这没有使代码相当混乱.有没有办法强制这个功能到我自己的方法?

c# arguments params

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