我有一个使用a IList<T>作为参数的方法.我需要检查该T对象的类型是什么,并根据它做一些事情.我试图使用该T值,但编译器不允许它.我的解决方案如下:
private static string BuildClause<T>(IList<T> clause)
{
if (clause.Count > 0)
{
if (clause[0] is int || clause[0] is decimal)
{
//do something
}
else if (clause[0] is String)
{
//do something else
}
else if (...) //etc for all the types
else
{
throw new ApplicationException("Invalid type");
}
}
}
Run Code Online (Sandbox Code Playgroud)
必须有更好的方法来做到这一点.有什么方法可以检查T传入的类型然后使用switch语句?
我有一个C#.net webservice,我需要限制访问.我已经要求我的消费者使用用户名和密码来呼叫该服务.但是,有没有办法限制对实际的asmx页面和WSDL的访问?我需要通过用户名/密码和IP地址限制对webservice的访问.如果用户没有正确的凭据,我不希望他们知道Web服务中存在哪些web方法.
这可以通过IIS完成吗?我知道我可以通过IIS限制IP地址,但我还可以使用用户名/密码吗?
有没有其他方法可以在IIS之外执行此操作,也许使用C#.net?
有没有人能够在HTML中实现一个可滚动的表,其中TOP行和LEFT列被冻结,但表的其余部分是否可滚动?一个很好的例子是: Google Squared
我试图对谷歌平方表的代码进行逆向工程,但到目前为止我还没有成功.
注意:我需要能够同时冻结TOP ROW和LEFT COLUMN.
我有一个ASP.Net C#应用程序,需要每5分钟使用WebServices连接到一个外部API.
外部Web服务的要求如下:
我已经建立了以前的所有,但我目前有一个问题.存储当前和历史密码的最佳做法是什么?
显然,存储明文密码是一个糟糕的解决方案.我需要能够让我的web服务读取密码并随每个请求一起传输.我还需要能够访问所有历史密码,以确保我新生成的密码不重复.
理想情况下,我想将每个(加密的)密码存储在我的数据库中,并在需要调用Web服务时对其进行解密.我应该遵循最佳做法吗?我应该使用Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.Cryptographer.EncryptSymmetric(..)加密每个密码吗?
注意:不幸的是,我无权更改外部API的功能.我必须遵守所提供的规则.
在代码中解决此问题的最佳方法是什么?
问题是我有2美元的金额(称为底池),需要分配给3个人.每个人获得来自两个盆的特定数量,并且费率必须大致相同.我不断遇到问题,我的分配加起来太多或太少.
这是一个具体的例子:
锅#1 987,654.32
锅#2 123,456.78
人员#1获得分配金额:345,678.89
人员#2获得分配金额:460,599.73
人员#3获得分配金额:304,832.48
我的逻辑如下(代码在c#中):
foreach (Person person in People)
{
decimal percentage = person.AllocationAmount / totalOfAllPots;
decimal personAmountRunningTotal = person.AllocationAmount;
foreach (Pot pot in pots)
{
decimal potAllocationAmount = Math.Round(percentage * pot.Amount, 2);
personAmountRunningTotal -= potAllocationAmount;
PersonPotAssignment ppa = new PersonPotAssignment();
ppa.Amount = potAllocationAmount;
person.PendingPotAssignments.Add(ppa);
}
foreach (PersonPotAssignment ppa in person.PendingPotAssignments)
{
if (personAmountRunningTotal > 0) //Under Allocated
{
ppa.Amount += .01M;
personAmountRunningTotal += .01M;
}
else if (personAmountRunningTotal < 0) //Over Allocated …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 LINQ 中执行复杂的 GroupBy,但我的键选择器遇到问题。在下面的代码中,我可以按一个方向的密钥进行分组(按 SellerID、BuyerID),但实际上我还需要按相反的密钥进行分组(按 SellerID、BuyerID 或 BuyerID、SellerID)。我这个查询的最终目标是当密钥反转时,我需要将资产金额设置为负数。这将使我能够扣除双方存在的任何金额,然后我最终将只得到该特定一方有金额的记录。
下面的代码应该解释它:
public class Record
{
public int RecordID;
public int SellerID;
public int BuyerID;
public List<Asset> Assets;
}
public class Asset
{
public int AssetID;
public decimal Amount;
}
var groups = new List<Record>
{
new Record { RecordID = 1, SellerID = 100, BuyerID = 200, Assets = new List<Asset> { new Asset { AssetID = 5, Amount = 10 }}},
new Record { RecordID = 2, SellerID = 100, BuyerID …Run Code Online (Sandbox Code Playgroud) 我无法将对象转换为通用IList.我有一组in语句试图解决这个问题,但必须有一个更好的方法来做到这一点.
这是我目前的方法:
string values;
if (colFilter.Value is IList<int>)
{
values = BuildClause((IList<int>)colFilter.Value, prefix);
}
else if (colFilter.Value is IList<string>)
{
values = BuildClause((IList<string>)colFilter.Value, prefix);
}
else if (colFilter.Value is IList<DateTime>)
{
values = BuildClause((IList<DateTime>)colFilter.Value, prefix);
}
else if (...) //etc.
Run Code Online (Sandbox Code Playgroud)
我想要做的是:
values = BuildClause((IList<colFilter.ColumnType>)colFilter.Value, prefix);
Run Code Online (Sandbox Code Playgroud)
要么
values = BuildClause((IList<typeof(colFilter.ColumnType)>)colFilter.Value, prefix);
Run Code Online (Sandbox Code Playgroud)
要么
values = BuildClause((IList<colFilter.ColumnType.GetType()>)colFilter.Value, prefix);
Run Code Online (Sandbox Code Playgroud)
其中每个都会产生此编译器错误:找不到类型或命名空间名称'colFilter'(您是否缺少using指令或程序集引用?)
在我的例子中,colFilter.ColumnType是int,string,datetime等.我不知道为什么这不起作用.
有任何想法吗?
编辑:这是C#2.0
编辑#2
这是BuildClause方法(我有每种类型的重载):
private static string BuildClause(IList<int> inClause, string strPrefix)
{
return BuildClause(inClause, strPrefix, false);
}
private static string BuildClause(IList<String> inClause, string …Run Code Online (Sandbox Code Playgroud) 为便士的价值创造一个常数是否有意义?例如,如果我需要减少一分钱的金额.如果代码说:你认为它更具可读性吗?
amount -= Constants.StandardAmounts.Penny
Run Code Online (Sandbox Code Playgroud)
或者我甚至不应该打扰并只使用.01.
我需要通过例子来解释这个:
是否有在数据库表中指定DateTime和BIT的最佳实践或首选项?
在我的数据库中,我有一个Widget表.我需要知道一个小部件是否"已关闭"并且它是"关闭日期"业务规则说如果一个小部件关闭,它必须有一个关闭日期.如果窗口小部件未关闭,则不应具有"关闭日期".
为了设计这个,我可以做到以下几点:
(例1):
CREATE TABLE [Widget]
(
[WidgetID] INT IDENTITY(1,1)
,[ClosedDate] DATETIME NULL
)
Run Code Online (Sandbox Code Playgroud)
或(例2):
CREATE TABLE [Widget]
(
[WidgetID] INT IDENTITY(1,1)
,[IsClosed] BIT NOT NULL CONSTRAINT [DF_Widget_IsClosed] DEFAULT (0)
,[ClosedDate] DATETIME NULL
)
Run Code Online (Sandbox Code Playgroud)
我认为示例1更清晰,因为它不用担心会减少一个列.但是,每当我需要评估Widget是否已关闭时,我需要一个额外的步骤来确定ClosedDate列是否为非NULL.
示例2创建了额外的开销,因为现在我必须保持IsClosed和ClosedDate值同步.
在设计这样的东西时有最好的做法吗?对于示例2,查询表格会更有效吗?我有什么理由选择一种设计而不是另一种设计?
注意:我将通过ORM工具和存储过程访问此值.
如果我有两个类型为T的变量,是否可以获得两个变量之间的所有值,假设两个T类型相同?
我在.net 2.0中工作,并基于此代码构建了一个Range类:日期范围的交集
如果我知道类型是DateTime,很容易循环遍历日期,从Start值到End值.像这样:
List<DateTime> values = new List<DateTime>();
for (DateTime d = myRange.Start; d <= myRange.End; d = d.AddDays(1))
{
values.Add(d);
}
Run Code Online (Sandbox Code Playgroud)
但是,为了使这更通用,有没有办法做任何类型T?
我要求一些不可能的东西吗?
我有一个很大的整数列表,发送到我的webservice.我们的业务规则规定这些值必须是唯一的.什么是最有效的方法来确定是否有任何重复?我不需要知道值,我只需要知道其中两个值是否相等.
起初我正在考虑使用整数通用列表和list.Exists()方法,但这是O(n);
然后我考虑使用Dictionary和ContainsKey方法.但是,我只需要键,我不需要值.而且我认为这也是线性搜索.
是否有更好的数据类型可用于查找列表中的唯一性?还是我坚持线性搜索?